Asp.net mvc 如何使用FakeiTasy伪造对象初始化?

Asp.net mvc 如何使用FakeiTasy伪造对象初始化?,asp.net-mvc,unit-testing,fakeiteasy,Asp.net Mvc,Unit Testing,Fakeiteasy,以下是我想为其编写单元测试的代码: public virtual ActionResult TryIt() { MemberViewModel viewModel = new MemberViewModel(); _memberViewModelLookupBuilder.PopulateSelectLists(viewModel); return View(viewModel); } 我想编写单元测试来伪造MemberViewModel对象,这样我就可以为操作中的

以下是我想为其编写单元测试的代码:

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

    _memberViewModelLookupBuilder.PopulateSelectLists(viewModel);

    return View(viewModel);
}
我想编写单元测试来伪造MemberViewModel对象,这样我就可以为操作中的其余操作编写测试。 类似于-

A.CallTo(() => viewModel = new TryItViewModel()).Returns(viewModel);
但这不起作用,并给出了一个错误的说法

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

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

我正在测试项目中使用xUnit和FakeiTesy


非常感谢在这方面的任何帮助。

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

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

public virtual ActionResult TryIt(IMemberViewModel viewModel)
{
     _memberViewModelLookupBuilder.PopulateSelectLists(viewModel);
    return View(viewModel);
}
在生产代码中,您将传入一个
新成员视图模型
。然后,测试将伪造对象:

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

TryIt(fakeMemberViewModel);

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

另一个例子,请参阅。

如果我没有错的话,我认为Mock框架提供了使用“Setup”方法伪造类构造函数的能力。不确定提供的解决方案是否适用于更大规模的项目。我的意思是,为每个ViewModel创建接口应该不是一件容易的事情。我相信Fakeitesy应该有一些机制来实现这一点。@Nirman,我不理解你所有的评论:“我认为Mock framework提供了使用“Setup”方法伪造类构造函数的能力,”除此之外,我看到建议的方法每天都在相当大的企业软件系统中起作用。尽管如此,我知道这并不那么方便。由于Fakeitesy是建立在平台上的,因此伪造施工人员是不可行的。但是,其他模拟框架,如和,确实支持模拟构造函数。