Moq的结果取决于输入

时间:2014-02-21 13:22:16

标签: c# unit-testing moq

我对Moq电话有点困惑。我需要Moq一个带对象的函数。它应返回一个不同的对象,其内容由现有函数生成,该对象从输入对象的字段获取其输入。

所以我在输入中提供了一个复杂的对象,其中一个字段等于某个数字,我需要回复一个考虑到某个数字而生成的对象。

我想出了下面的草图,但它充满了错误。我很欣赏如何做我需要的适当的入门书。

var processor = new Mock<IMyCommandProcessor>();
processor.Setup(d => d.ProcessCommand(It.IsAny<MyCommand>))
    .Returns((MyResponse r) => r.Results = new List{ newDto(aaa) });

newDto(aaa)是函数的调用,而不是aaa我需要一个来自输入的MyCommand对象的字段。我怎么能在这里宣布嘲笑?非常感谢!

3 个答案:

答案 0 :(得分:2)

只是一个通用的例子: 你可以用任何方法替换input + input

    [Test]
    public void TestMock()
    {
        var a = new Mock<IDictionary<string, string>>();
        a.Setup(d => d[It.IsAny<string>()]).Returns((string input) => input + input);
        string result = a.Object["test"];
    }

答案 1 :(得分:1)

您应该在返回回调中使用输入参数:

processor.Setup(d => d.ProcessCommand(It.IsAny<MyCommand>))
         .Returns((MyCommand c) => new MyResponse()});

但是,如果在您正在测试的课程中定义了newDto函数,则无法访问该函数。

答案 2 :(得分:1)

如果newDto(aaa)是对辅助函数的调用,那么您可以尝试:

processor.Setup(d => d.ProcessCommand(It.IsAny<MyCommand>))
         .Returns((MyCommand c) => new MyResponse(){ Results = new List<DtoType>(){ newDto(aaa)}});