上一篇最后出现的错误是因为断言 assertEquals(1, Post.count()); 出错,取到的Post的数量不是1,运行Test之前,表中有数据

可以添加以下方法,运行Test前清空数据

  1. @Before
  2. public void setup() {
  3. Fixtures.deleteAll();
  4. }

  

1.编写复杂的测试用例

编辑/test/data.yml

  1. # User(bob):
  2. # email: bob@gmail.com
  3. # password: secret
  4. # fullname: Bob

内容替换为 http://play-framework.herokuapp.com/zh/files/data.yml

添加测试用例

  1.      @Test
  2. public void fullTest() {
  3. Fixtures.loadModels("data.yml");
  4.  
  5. // Count things
  6. assertEquals(2, User.count());
  7. assertEquals(3, Post.count());
  8. assertEquals(3, Comment.count());
  9.  
  10. // Try to connect as users
  11. assertNotNull(User.connect("bob@gmail.com", "secret"));
  12. assertNotNull(User.connect("jeff@gmail.com", "secret"));
  13. assertNull(User.connect("jeff@gmail.com", "badpassword"));
  14. assertNull(User.connect("tom@gmail.com", "secret"));
  15.  
  16. // Find all of Bob's posts
  17. List<Post> bobPosts = Post.find("author.email", "bob@gmail.com")
  18. .fetch();
  19. assertEquals(2, bobPosts.size());
  20.  
  21. // Find all comments related to Bob's posts
  22. List<Comment> bobComments = Comment.find("post.author.email",
  23. "bob@gmail.com").fetch();
  24. assertEquals(3, bobComments.size());
  25.  
  26. // Find the most recent post
  27. Post frontPost = Post.find("order by postedAt desc").first();
  28. assertNotNull(frontPost);
  29. assertEquals("About the model layer", frontPost.title);
  30.  
  31. // Check that this post has two comments
  32. assertEquals(2, frontPost.comments.size());
  33.  
  34. // Post a new comment
  35. frontPost.addComment("Jim", "Hello guys");
  36. assertEquals(3, frontPost.comments.size());
  37. assertEquals(4, Comment.count());
  38. }

  

关于如何使用 data.yml,可以参考 http://play-framework.herokuapp.com/zh/yaml

2.初始化数据

开始创建应用程序的第一个页面。这个页面就会显示最近的帖子,以及旧的文章的列表。

在开发第一个屏幕之前我们需要一件事。创建测试数据。将默认数据注入到博客的一个方法是加载文件在应用程序的加载时间。要做到这一点,我们将创建一个引导工作。

创建Bootstrap.java

  1. package models;
  2.  
  3. import play.*;
  4. import play.jobs.*;
  5. import play.test.*;
  6.  
  7. @OnApplicationStart
  8. public class Bootstrap extends Job {
  9. public void doJob() {
  10. // Check if the database is empty
  11. if (User.count() == 0) {
  12. Fixtures.loadModels("initial-data.yml");
  13. }
  14. }
  15. }

initial-data.yml 使用data.yml的内容,创建的默认数据

@OnApplicationStart 标识方法在应用程序启动时运行

3.开发首页

修改Application.java 的index()方法

  1. public static void index() {
  2. Post frontPost = Post.find("order by postedAt desc").first();
  3. List<Post> olderPosts = Post.find("order by postedAt desc").from(1)
  4. .fetch(10);
  5. render(frontPost, olderPosts);
  6. }

  

修改Application/index.html

  1. #{extends 'main.html' /}
  2. #{set title:'Home' /}
  3.  
  4. #{if frontPost}
  5. <div class="post">
  6. <h2 class="post-title">
  7. <a href="#">${frontPost.title}</a>
  8. </h2>
  9.  
  10. <div class="post-metadata">
  11. <span class="post-author">by ${frontPost.author.fullname}</span>
  12. <span class="post-data">by ${frontPost.postedAt.format('MMM dd')}</span>
  13. <span class="post-comments">
  14. &nbsp;|&nbsp;
  15. ${frontPost.comments.size()?:'no'}
  16. comment${frontPost.comments.size().pluralize()}
  17. #{if frontPost.comments}
  18. , latest by ${frontPost.comments[0].author}
  19. #{/if}
  20. </span>
  21. </div>
  22.  
  23. <div class="post-content">
  24. ${frontPost.content.nl2br()}
  25. </div>
  26. </div>
  27.  
  28. #{if olderPosts.size()>1}
  29. <div class="older-posts">
  30. <h3>Older posts <span class="from">from this blog</span></h3>
  31.  
  32. #{list items:olderPosts, as:'oldPost'}
  33. <div class="post">
  34. <h2 class="post-title">
  35. <a href="#">${oldPost.title}</a>
  36. </h2>
  37.  
  38. <div class="post-metadata">
  39. <span class="post-author">
  40. by ${oldPost.author.fullname}
  41. </span>
  42. <span class="post-date">
  43. ${oldPost.postedAt.format('dd MMM yy')}
  44. </span>
  45. <div class="post-comments">
  46. ${oldPost.comments.size()?:'no'}
  47. comment${oldPost.comments.size().pluralize()}
  48. #{if oldPost.comments}
  49. - latest by ${oldPost.comments[0].author}
  50. #{/if}
  51. </div>
  52. </div>
  53. </div>
  54. #{/list}
  55. </div>
  56. #{/if}
  57. #{/if}
  58.  
  59. #{else}
  60. <div class="empty">
  61. There is currently nothing to read here.
  62. </div>
  63. #{/else}

  

4.打开站点

..

Play Framework 完整实现一个APP(四)的更多相关文章

  1. Play Framework 完整实现一个APP(十四)

    添加测试 ApplicationTest.java @Test public void testAdminSecurity() { Response response = GET("/adm ...

  2. Play Framework 完整实现一个APP(十一)

    添加权限控制 1.导入Secure module,该模块提供了一个controllers.Secure控制器. /conf/application.conf # Import the secure m ...

  3. Play Framework 完整实现一个APP(五)

    程序以及基本可用了,需要继续完善页面 1.创建页面模板 创建文件 app/views/tags/display.html *{ Display a post in one of these modes ...

  4. Play Framework 完整实现一个APP(二)

    1.开发DataModel 在app\moders 下新建User.java package models; import java.util.*; import javax.persistence. ...

  5. Play Framework 完整实现一个APP(十三)

    添加用户编辑区 1.修改Admin.index() public static void index() { List<Post> posts = Post.find("auth ...

  6. Play Framework 完整实现一个APP(十二)

    1.定制CRUD管理页面 > play crud:ov --layout 替换生成文件内容 app/views/CRUD/layout.html #{extends 'admin.html' / ...

  7. Play Framework 完整实现一个APP(十)

    1.定制Comment列表 新增加Comment list页面,执行命令行 > play crud:ov --template Comments/list 会生成/app/views/Comme ...

  8. Play Framework 完整实现一个APP(九)

    添加增删改查操作 1.开启CRUD Module 在/conf/application.conf 中添加 # Import the crud module module.crud=${play.pat ...

  9. Play Framework 完整实现一个APP(八)

    创建Tag标签 1.创建Model @Entity @Table(name = "blog_tag") public class Tag extends Model impleme ...

随机推荐

  1. MVC, MVP, MVVM比较以及区别(下)

    上一篇得到大家的关注,非常感谢.一些朋友评论中,希望快点出下一篇.由于自己对于这些模式的理解也是有限,所以这一篇来得迟了一些.对于这些模式的比较,是结合自己的理解,一些地方不一定准确,但是只有亮出自己 ...

  2. cordova plugin add出现CERT_UNTRUSTED错误解决方法

    介绍 目前使用ionic+cordova完成hybmid app开发,在安装geolocation插件时爆出来一个莫名的错误: Fetching from npm failed: CERT_UNTRU ...

  3. 大小写互换-"数字字符串"转换成数字

    今天穿着hacker浑浊马甲在百度编程课堂实训习题中发现了这个很简单的问题,就做了下. 为了考虑输入的是否是数字,结果写好后竟然超时了. 不过里面用到的将字符串装换成数字的方法,感觉是个收获,因此在此 ...

  4. JavaScript中的数据类型转换

    本文中提到的“原始值”指的是undefined,null,Boolean,string和number. 本文中的对象是native对象,宿主对象(浏览器定义的对象)按照各自的算法转换. JavaScr ...

  5. 为 Web 设计师准备的 20 款 CSS3 工具

    1.CSS3 Generator 2. Border Radius 3. CSS3 Maker 4. CSS3 Transforms 5. CSS3 Drop shadow generator 6. ...

  6. Hibernate —— HQL、QBC检索方式

    一.HQL 检索方式 以双向的一对多来测试 HQL 检索方式.以 Department 和 Employee 为例. 建表语句: CREATE TABLE department ( dept_id ) ...

  7. Keil环境中建立带FreeRTOS的STM32L项目

    本文是网上转载,版权所有. Keil环境中建立带FreeRTOS的STM32L项目 1.先把source文件夹复制至project目录,然后在keil中添加RTOS文件,如图: 其中heap_2.c按 ...

  8. # ASP.NET Core依赖注入解读&使用Autofac替代实现

    标签: 依赖注入 Autofac ASPNETCore ASP.NET Core依赖注入解读&使用Autofac替代实现 1. 前言 2. ASP.NET Core 中的DI方式 3. Aut ...

  9. iOS阶段学习第34天笔记(UI小组件 UISegment-UISlider-UIStepper-UIProgressView-UITextView介绍)

    iOS学习(UI)知识点整理 一.UI小组件 1.UISegmentedControl 分段选择器  实例代码 - (void)viewDidLoad { [super viewDidLoad]; / ...

  10. 解决EP拒绝访问注册表Global键的的问题

    问题描述   打开EP站点时出现如下Error: Message: An unhandled error has occurred. To view details about this error, ...