模拟Controller用于测试视图层的方法

时间:2011-12-16 15:44:38

标签: controller mocking playframework

我想测试视图图层

我有一个带方法的控制器

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

  List<String> data = ....

  render(data);
}
..
}

我有网络驱动程序测试(功能测试),可以测试数据能够显示作为页面上的列表。

那么,我如何在PlayFramework的控制器中模拟do()方法,以便不依赖于从某个地方获取的真实数据?常见的方法是什么?如果在某个特定的测试中被嘲笑,游戏如何知道/使用这个控制器的方法..?

- 在得到一些评论(thx)后添加:

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

但我的控制器的逻辑尚未准备好,我只知道它将返回&lt;字符串&gt;在视图中,我需要在&lt;中显示这个字符串。 li> HTML元素。而已。

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

  • 我还不知道我将如何实现我的控制器,我现在将返回什么 - 然而,对于视图而言,控制器如何工作并不重要 - 查看只显示这些数据,我想测试一下 - 是否能够在html中显示任何数据,如列表。

3 个答案:

答案 0 :(得分: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);
    }
}

答案 1 :(得分:1)

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

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

答案 2 :(得分:0)

如果要测试视图图层,请使用Selenium。 它由Play提供。

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

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

在您的更新后添加:

也许你可以在开发控制器之前对列表进行硬编码。