如何验证 Moq 中的对象类型参数
How to Verify object Type parameters in Moq
我想使用匿名参数测试方法执行,但使用已知属性。
public interface IToTest
{
void MethodToTest(object data);
}
我就是这样实现的:
Mocker.Mock<IToTest>
.Verify(x=>x.MethodToTest(
It.Is<object>(
obj=>obj.Equals(new { DataProperty = "Test"})
)),
Times.Once());
测试未通过。
我不想用
It.IsAny<object>()
因为我知道预期的数据。
您当前的委托正在测试 整个对象 obj
等于匿名类型对象 new { DataProperty = "Test"}
- 这不太可能测试您的内容想要。
您需要做的是检查:
1) obj
有一个 属性 与您期望的名称。
2) 属性 具有您期望的值。
使用反射,您可以使用类似以下内容进行两项检查:
Mocker.Mock<IToTest>
.Verify(x => x.MethodToTest(
It.Is<object>(
obj =>
obj.GetType().GetProperty("PropertyOne") != null &&
obj.GetType().GetProperty("PropertyOne").GetValue(obj).ToString() == "Test"
)),
Times.Once());
重要说明 - 对于 属性 不存在的情况,不要忘记对 GetProperty()
结果进行 NULL 检查。
您将需要在委托中使用反射来进行比较,或使用 FluentAssertions
之类的东西来卸载繁重的工作
例如
//...
var expected = new {
DataProperty = "Test"
//...known properties
};
Func<object, bool> match = _ => {
_.Should().BeEquivalentTo(expected);
return true;
};
Mocker.Mock<IToTest>
.Verify(x =>
x.MethodToTest(It.Is<object>(obj => match(obj))),
Times.Once());
或者,您可以改为在回调中捕获对象参数,然后使用流畅的断言断言捕获的参数。
我想使用匿名参数测试方法执行,但使用已知属性。
public interface IToTest
{
void MethodToTest(object data);
}
我就是这样实现的:
Mocker.Mock<IToTest>
.Verify(x=>x.MethodToTest(
It.Is<object>(
obj=>obj.Equals(new { DataProperty = "Test"})
)),
Times.Once());
测试未通过。
我不想用
It.IsAny<object>()
因为我知道预期的数据。
您当前的委托正在测试 整个对象 obj
等于匿名类型对象 new { DataProperty = "Test"}
- 这不太可能测试您的内容想要。
您需要做的是检查:
1) obj
有一个 属性 与您期望的名称。
2) 属性 具有您期望的值。
使用反射,您可以使用类似以下内容进行两项检查:
Mocker.Mock<IToTest>
.Verify(x => x.MethodToTest(
It.Is<object>(
obj =>
obj.GetType().GetProperty("PropertyOne") != null &&
obj.GetType().GetProperty("PropertyOne").GetValue(obj).ToString() == "Test"
)),
Times.Once());
重要说明 - 对于 属性 不存在的情况,不要忘记对 GetProperty()
结果进行 NULL 检查。
您将需要在委托中使用反射来进行比较,或使用 FluentAssertions
之类的东西来卸载繁重的工作
例如
//...
var expected = new {
DataProperty = "Test"
//...known properties
};
Func<object, bool> match = _ => {
_.Should().BeEquivalentTo(expected);
return true;
};
Mocker.Mock<IToTest>
.Verify(x =>
x.MethodToTest(It.Is<object>(obj => match(obj))),
Times.Once());
或者,您可以改为在回调中捕获对象参数,然后使用流畅的断言断言捕获的参数。