Moq - 具有通用匿名参数的设置方法

时间:2015-12-09 17:54:05

标签: c# generics moq anonymous-types

我有一个带有以下签名的方法:

MDK_PKG_ID="com.xamarin.mono-MDK.pkg"
MDK_PKG = "MonoFramework-MDK-4.2.1.macos10.xamarin.x86.pkg"
MDK_URL = "http://download.mono-project.com/archive/4.2.1//macos-10-x86/#{MDK_PKG}"
curl -O ${MDK_URL}
sudo installer -pkg ${MDK_PKG} -target /

如您所见,该模型是一种通用类型。从测试代码中调用该方法,如下所示:

public string ParseFile<T>(string filepath, T model)

我为提供程序提供了一个模拟对象。我需要伪造这个方法的调用,返回我提供的值,即我需要这样的东西:

var model = new
        {
            SubmittedBy = submittedBy,
            SubmittedDateTime = DateTime.Now,
            Changes = changes
        };
string mailTemplate = provider.ParseFile(filePath, model);

测试运行时,不会返回我尝试设置的值。我不能使用It.IsAny(),因为实际类型是匿名的。如果我尝试在调试器中使用实际的 object 实例调用该方法,它就可以工作。但是,我如何说服它采取匿名对象?或者根本不关心论点?

1 个答案:

答案 0 :(得分:0)

匿名类型仍然是object,您发布的设置方法应该匹配。这是一个工作示例

public interface IThing
{
    string DoIt<T>(T it);
}

public class Subject
{
    ...

    public string Execute()
    {
        var param = new
        {
            Foo = "bar",
            Baz = 23
        };
        return _thing.DoIt(param);
    }
}

[Test]
public void Test()
{
    var mockThing = new Mock<IThing>();
    mockThing.Setup(t => t.DoIt(It.IsAny<object>()))
        .Returns("expectedResult");

    var subject = new Subject(mockThing.Object);
    var result = subject.Execute();

    Assert.That(result, Is.EqualTo("expectedResult"));
}

您还可以捕获传递给模拟的对象,并使用dynamic + Callback方法对其执行断言。

[Test]
public void Test()
{
    dynamic param = null;

    var mockThing = new Mock<IThing>();
    mockThing.Setup(t => t.DoIt(It.IsAny<object>()))
        .Callback<object>(p => param = p);

    var subject = new Subject(mockThing.Object);
    subject.Execute();

    Assert.That(param.Foo, Is.EqualTo("bar"));
    Assert.That(param.Baz, Is.EqualTo(23));
}