很简单的例子:
public class Test
{
private int _field;
public Test(int field)
{
_field = field;
}
}
现在我想检查是否使用类型为Test的参数调用方法,其构造函数参数等于5
_mock.Verify(x => x.Method(It.Is<Test>(constructor parameter equal to 5)));
答案 0 :(得分:3)
如果我理解正确,你有一个SUT(SystemUnderTest
,下面),它调用你用类(IDependency
)的对象模拟的依赖项(Test
)不公开公共getter属性。就目前而言,您需要使用像反射这样的黑客来检查私有值,例如:
public static TReturn GetPrivateField<TIn,TReturn>(TIn instance,
string fieldName)
{
var fieldInfo = typeof(TIn).GetField(fieldName, BindingFlags.NonPublic |
BindingFlags.Instance);
return (fieldInfo != null)
? (TReturn)fieldInfo.GetValue(instance)
: default(TReturn);
}
[Test]
public void EnsureMethod()
{
var mock = new Mock<IDependency>();
var sut = new SystemUnderTest(mock.Object);
sut.DoSomethingGoodWithTest();
mock.Verify(x => x.Method(It.Is<Test>(
t => GetPrivateField<Test, int>(t, "_field") == 5)));
}
显然这远非理想,如果可能的话,可以重新考虑这种方法:
如果您无法将访问权限更改为Test._field
,例如使用公共吸气剂,但能够改变被测试类的设计,另一种方法是使用可注射工厂来创建Test
类,例如用IFactory.Create(int x)
之类的方法。这样您就可以在测试期间模拟工厂,然后拦截Create调用并验证SUT确实正在创建具有所需构造参数的Test
对象。
答案 1 :(得分:2)
除了测试构造函数之外,您应该以某种方式测试该属性是否设置了正确的值。看看您是否可以使用方法或属性或任何其他方式公开它。
如果您无法访问该类以暴露该属性,则必须查看它是如何被使用的,即您要查找使用5或10或其他任何方式初始化的副作用。