我有一个带有以下签名的方法:
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 实例调用该方法,它就可以工作。但是,我如何说服它采取匿名对象?或者根本不关心论点?
答案 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));
}