嘲笑控制器的测试视图层的方法
我想测试视图层。嘲笑控制器的测试视图层的方法
我有方法
class Controller ... {
public void do() {
List<String> data = ....
render(data);
}
..
}
一个控制器I具有web的驱动器测试(功能测试),该测试能够数据要显示为页面上的列表。
那么,我怎样才能嘲笑PlayFramework的控制器中的do()方法,以便不依赖于从某处获取的真实数据?什么是常用方法?如果游戏在某些特定的测试中被嘲笑,将如何知道/使用该控制器的方法。
- 已经得到了一些意见(THX)后增加:
我只是想测试一个视图时,控制器会返回一些数据返回给它。
但我的控制器的逻辑还没有准备好,我只知道它会返回列表< String>,并且在视图中,我需要显示这个字符串在< li> html元素中。而已。
我什么都不知道 - 我将如何实现我的控制器,它将使用数据库或Web服务将数据返回到视图(为什么我不能在我的控制器中模拟任何东西..让我们说Http.get( )..或Database.get())..
- 我还不知道我将如何实现我的控制,我现在该怎么办,它将返回 - 然而,对于视图不要紧控制器如何完成其工作 - 视图只显示这些数据,我想测试它 - 是否能够显示任何数据,如html中的列表。
我对PlayFramework一无所知,但这是单元测试MVC时出现的一个常见问题。一般来说,你有你的'功能'或集成测试,测试整个事情是否有效,并为你的模型进行单元测试。除了需要100%的代码覆盖率之外,您还需要问自己,您是否确实需要测试此代码。
如果您决定这样做,那么我会着重于重构您的函数,以使用依赖注入将模拟对象注入要测试的函数中。但是,如果您必须对单元测试代码进行重构,那么您的集成测试将涵盖这些代码,那么它真的需要吗?
如果你想测试你的视图层,使用Selenium。 它由Play提供。
此外,您可以使用特殊的数据库版本进行测试。
不要试图模拟控制器:使用内存数据库(非常快)并在其中加载数据用于测试。
添加您的更新后:
也许直到你开发控制器,你可以硬编码的列表。
构建一个接口以使用获取数据的方法。
public interface DataProvider {
public List<String> getData();
}
对于测试,您可以使用提供某些测试值的类来实现此接口。
public class MockDataProvider implements DataProvider {
public List<String> getData() {
String[] testData = {"a","b","c"};
return Arrays.asList(testData);
}
}
后来,当你知道从那里您将获取数据(数据库,Web请求,不管)你只是再次实现你的接口。
public class WebProvider implements DataProvider {
public List<String> getData() {
... WS.url("http://service.example.com").get();
// fetch the data
return dataList;
}
}
而在你的控制器中,你可以切换你是否处于测试模式。
class MyController ... {
public static void datalist() {
DataProvider provider;
if (Play.runingInTestMode()) {
provider = new MockDataProvider();
} else {
provider = new WebProvider();
}
List<String> data = provider.getData();
render(data);
}
}
我在我的描述中添加了一些解释。 (无论如何,Thx的回复) – ses 2011-12-16 20:58:55