2015-10-15 91 views
0

下面是我想要编写单元测试代码:我想编写单元测试,以假冒MemberViewModel对象,这样我可以写在行动操作的其余测试如何使用FakeItEasy伪造对象初始化?

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

    _memberViewModelLookupBuilder.PopulateSelectLists(viewModel); 

    return View(viewModel); 
} 

。 喜欢的东西 -

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

但是,这并不工作,并给出了一个错误说

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

任何人都可以请指教如何我可以做到这一点?

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

对此非常感谢。

回答

2

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

+0

我认为模拟框架提供了使用“设置”方法伪造类构造函数的能力,如果我没有错的话。不确定,如果提供的解决方案将在大型项目中发挥作用。我的意思是,为每个ViewModel创建接口不应该是一件容易的事。我相信FakeItEasy应该有一些机制来允许这一点。 – Nirman

+1

@Nirman,我不明白你所有的意见: “我认为模拟框架提供了使用”设置“方法伪造类构造函数的能力,” 除此之外,我看到了建议的方法在相当大的一个企业软件系统中。 这就是说,我明白这并不是那么方便。由于FakeItEasy平台是建立在平台上,伪造构造函数是不可行的。 但是,其他嘲笑框架,如[Isolator](http://www.typemock.com/isolator-product-page)和[JustMock](http://www.telerik.com/products/mocking.aspx )支持嘲笑构造函数。 –