2014-02-17 16 views
0

我想让我的脑袋围绕moq和mvc。我已经设置了一个moq并为其添加了一个有效的安装程序。添加一个方法来设置一个Moq测试

我的测试调用我的界面。

var id = 2; 
var customer = new Customer() 
{ 
    CustomerId = 2, 
    FirstName = "Tomas", 
    LastName = "Smith" 
}; 

var moq = new Mock<ICustomerRepository>(); 
moq.Setup(x => x.Find(id, 1234)) 
    .Returns(Task.FromResult(customer)); 

var controller = new MyController(moq.Object); 
var result = await controller.Get(id); 

现在,在我的获取操作中,我打电话给我的存储库以获取此案例中的一位客户。但我需要传入一个额外的参数,这是一个int

var customer = await _repository.FindAsync(customerid, GetSourceId()); 

我怎样才能moq GetSourceId()返回一个int?而实际上并不需要调用我知道的方法,因为它从请求头中提取数据会失败?

回答

1

如果GetSourceId()是在控制器上的方法,你就必须通过嘲笑构造:

// mock takes params of constructor args 
var ctlr = new Mock(Of MyController)(moq.Object); 
ctlr.Setup(i => i.GetSourceId()).Returns(5); 

var obj = ctlr.Object; 
var result = obj.Get(); 

我能那么直接调用操作方法上的模拟,它调用的逻辑为了我;我不需要在模拟上做一个明确的设置来调用原始方法。

+0

谢谢Brian。是的,我认为会有这样的缺点。 –

+0

对不起布赖恩我以为我有,但我没有。所以我使用类似于你的例子'var ctlr = new Mock (moq.Object); ctlr.Setup(i => i.GetSourceId())。设置GetSourceId。但是,我打算如何设置我想要调用的操作? –

+0

更正,我使用你的例子包含了一个上面的代码片断,这个代码片段适用于我。调用对象的方法调用原始方法没有问题。上述解决方案与我的几乎完全相同。 –

0
var getSource = Mock<IYourInterfaceHere>(); 
getSource.Setup(x => x.GetSource(YourParams)).Returns(1); 

随着起订量,如果你要打电话给你的Get方法,你将需要检查所有呼叫使用此Get方法的方法,并模拟所有的人,例如:

你的Get方法在里面调用GetSource()和GetSource(),调用另一个名为GetId()的方法,如果你想测试你的Get方法,你将需要模拟你的GetSource()和你的GetId() 。像级联。