gpt4 book ai didi

controller - 模拟 Controller 的方法来测试 View 层

转载 作者:行者123 更新时间:2023-12-01 12:58:03 26 4
gpt4 key购买 nike

我想测试一个 View 层

我有一个带有方法的 Controller

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

List<String> data = ....

render(data);
}
..
}

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

那么,我如何模拟 PlayFramework Controller 中的 do() 方法,以便不依赖于从某处获取的真实数据?常见的做法是什么?如果它在某些特定测试中被模拟,play 如何知道/使用这个 Controller 的方法..?

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

我只想测试一个 View ,当 Controller 将一些数据返回给它时。

但是我的 Controller 逻辑还没有准备好,我只知道它会返回 列表,在 View 中,我需要在

  • html 元素中显示这个字符串。而已。

    我什么都不知道——我将如何实现我的 Controller ,它会在其中使用数据库或网络服务将数据返回给 View (这就是为什么我不能在我的 Controller 中模拟任何东西……比方说 Http.get() .. 或 Database.get() )..

    • 我还不知道我将如何实现我的 Controller ,我现在知道它会返回什么 - 尽管如此,对于 View 来说, Controller 如何工作并不重要 - View 只显示这些数据,我想测试一下 -它是否能够显示任何数据,如 html 中的列表。

  • 最佳答案

    使用获取数据的方法构建接口(interface)。

    public interface DataProvider {
    public List<String> getData();
    }

    为了进行测试,您可以使用提供一些测试值的类来实现此接口(interface)。

    public class MockDataProvider implements DataProvider {
    public List<String> getData() {
    String[] testData = {"a","b","c"};
    return Arrays.asList(testData);
    }
    }

    稍后,当您知道从何处获取数据(数据库、网络请求等)时,您只需再次实现您的接口(interface)。

    public class WebProvider implements DataProvider {
    public List<String> getData() {
    ... WS.url("http://service.example.com").get();
    // fetch the data
    return dataList;
    }
    }

    并且在您的 Controller 中,您可以切换是否处于测试模式。

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

    关于controller - 模拟 Controller 的方法来测试 View 层,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8536543/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com