我试图让我的头围绕moq和mvc。我已经设置了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);
现在在我的Get操作中,我调用我的存储库来获得客户。但是我需要传入一个额外的参数,这是一个int
var customer = await _repository.FindAsync(customerid, GetSourceId());
我如何让moq GetSourceId()返回一个int?没有实际需要调用我知道的方法会因为从请求头中提取数据而失败吗?
答案 0 :(得分: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();
然后我可以直接在mock上调用action方法,它为我调用了逻辑;我不需要在模拟上进行显式设置来调用原始方法。
答案 1 :(得分:0)
var getSource = Mock<IYourInterfaceHere>();
getSource.Setup(x => x.GetSource(YourParams)).Returns(1);
使用Moq,如果要调用Get方法,则需要检查调用中使用此Get方法的所有方法,并模拟所有方法,例如:
你的Get方法在里面调用GetSource()和GetSource(),调用另一个叫做GetId()的方法,然后如果你试图测试你的Get方法,你需要模拟你的GetSource()和你的GetId ()也是。就像一个级联。