【问题标题】:How to fake the object initiation using FakeItEasy?如何使用 FakeItEasy 伪造对象启动?
【发布时间】:2016-05-31 21:56:30
【问题描述】:

以下是我要编写单元测试的代码:

public virtual ActionResult TryIt()
{
    MemberViewModel viewModel = new MemberViewModel();

    _memberViewModelLookupBuilder.PopulateSelectLists(viewModel);

    return View(viewModel);
}

我想编写单元测试来伪造 MemberViewModel 对象,这样我就可以为其余的操作编写测试。 类似的东西 -

A.CallTo(() => viewModel = new TryItViewModel()).Returns(viewModel);

但这不起作用并给出错误提示

“表达式树不能包含赋值运算符”

谁能告诉我如何做到这一点?

我在我的测试项目中使用 xUnit 和 FakeItEasy。

非常感谢任何帮助。

【问题讨论】:

    标签: asp.net-mvc unit-testing fakeiteasy


    【解决方案1】:

    FakeItEasy 不能对具体方法强加任意行为,例如类构造函数。你必须从一个假的开始并配置它。

    这可以通过将伪造的MemberViewModel 注入TryIt 方法来实现。典型的路线是从MemberViewModel 中提取一个接口(或者甚至更好,依赖于现有的接口),伪造它,然后将其传递给TryIt。所以TryIt变成了:

    public virtual ActionResult TryIt(IMemberViewModel viewModel)
    {
         _memberViewModelLookupBuilder.PopulateSelectLists(viewModel);
        return View(viewModel);
    }
    

    在您的生产代码中,您将传入new MemberViewModel。然后测试会伪造对象:

    var fakeMemberViewModel = A.Fake<IMemberViewModel>();
    A.CallTo(() => fakeMemberViewModel.SomeMethod()).Returns(17);
    
    TryIt(fakeMemberViewModel);
    
    …
    

    另一个例子,见FakeItEasy Quickstart

    【讨论】:

    • 如果我没记错的话,我认为 Mock 框架提供了使用“Setup”方法伪造类构造函数的能力。不确定所提供的解决方案是否适用于更大规模的项目。我的意思是,为每个 ViewModel 创建接口应该不是一件容易的事。我相信 FakeItEasy 应该有一些机制来允许这样做。
    • @Nirman,我不明白你所有的 cmets:“我认为 Mock 框架提供了使用“Setup”方法伪造类构造函数的能力,”除此之外,我看到了建议每天在相当大的企业软件系统中工作。话虽如此,我知道这并不是那么方便。由于 FakeItEasy 建立在平台上,伪造构造函数是不可行的。但是,其他模拟框架,例如 IsolatorJustMock 确实支持模拟构造函数。
    猜你喜欢
    • 1970-01-01
    • 2012-06-02
    • 1970-01-01
    • 2012-07-16
    • 2022-10-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多