2011-12-16 82 views
3

我想测试视图层嘲笑控制器的测试视图层的方法

我有方法

class Controller ... { 
public void do() { 

    List<String> data = .... 

    render(data); 
} 
.. 
} 

一个控制器I具有web的驱动器测试(功能测试),该测试能够数据要显示为页面上的列表。

那么,我怎样才能嘲笑PlayFramework的控制器中的do()方法,以便不依赖于从某处获取的真实数据?什么是常用方法?如果游戏在某些特定的测试中被嘲笑,将如何知道/使用该控制器的方法。

- 已经得到了一些意见(THX)后增加:

我只是想测试一个视图时,控制器会返回一些数据返回给它。

但我的控制器的逻辑还没有准备好,我只知道它会返回列表< String>,并且在视图中,我需要显示这个字符串在< li> html元素中。而已。

我什么都不知道 - 我将如何实现我的控制器,它将使用数据库或Web服务将数据返回到视图(为什么我不能在我的控制器中模拟任何东西..让我们说Http.get( )..或Database.get())..

  • 我还不知道我将如何实现我的控制,我现在该怎么办,它将返回 - 然而,对于视图不要紧控制器如何完成其工作 - 视图只显示这些数据,我想测试它 - 是否能够显示任何数据,如html中的列表。

回答

1

我对PlayFramework一无所知,但这是单元测试MVC时出现的一个常见问题。一般来说,你有你的'功能'或集成测试,测试整个事情是否有效,并为你的模型进行单元测试。除了需要100%的代码覆盖率之外,您还需要问自己,您是否确实需要测试此代码。

如果您决定这样做,那么我会着重于重构您的函数,以使用依赖注入将模拟对象注入要测试的函数中。但是,如果您必须对单元测试代码进行重构,那么您的集成测试将涵盖这些代码,那么它真的需要吗?

+0

我在我的描述中添加了一些解释。 (无论如何,Thx的回复) – ses 2011-12-16 20:58:55

0

如果你想测试你的视图层,使用Selenium。 它由Play提供。

此外,您可以使用特殊的数据库版本进行测试。

不要试图模拟控制器:使用内存数据库(非常快)并在其中加载数据用于测试。

添加您的更新后:

也许直到你开发控制器,你可以硬编码的列表。

3

构建一个接口以使用获取数据的方法。

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); 
    } 
}