【问题标题】:Add a method to the setup of a Moq test将方法添加到 Moq 测试的设置
【发布时间】:2014-02-17 23:34:52
【问题描述】:

我正在努力了解起订量和 mvc。我已经设置了一个最小起订量并为其添加了一个有效的设置。

我的测试调用我的接口。

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());

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

【问题讨论】:

    标签: c# unit-testing moq


    【解决方案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 方法,它为我调用了逻辑;我不需要在 mock 上进行显式设置来调用原始方法。

    【讨论】:

    • 谢谢布赖恩。是的,我认为会有这样的缺点。
    • 对不起,布莱恩,我以为我拥有它,但我没有。所以我使用类似于你的例子的东西 `var ctlr = new Mock(moq.Object);ctlr.Setup(i => i.GetSourceId()).Returns(5);设置 GetSourceId。但是我打算在哪里设置我想要调用的操作?
    • 更正,我在上面包含了一个 sn-p,使用你的例子,对我有用的情况。调用对象上的方法调用原始方法没有问题。上述解决方案与我的几乎相同。
    【解决方案2】:
    var getSource = Mock<IYourInterfaceHere>();
    getSource.Setup(x => x.GetSource(YourParams)).Returns(1);
    

    使用 Moq,如果要调用 Get 方法,则需要检查调用中使用此 Get 方法的所有方法,并模拟所有方法,例如:

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

    【讨论】:

      猜你喜欢
      • 2012-11-11
      • 1970-01-01
      • 2013-02-10
      • 1970-01-01
      • 2014-04-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-04
      相关资源
      最近更新 更多