【发布时间】:2018-09-25 13:41:57
【问题描述】:
我有这个抽象类,我想测试它。我想确保在调用SomeMethod 时,会调用ValidateStronglyTypedData。
public abstract class SomeAbstractClass<TDataType> where TDataType : class
{
public ResultType SomeMethod(string someParam)
{
TDataType tDataType = convert(someParam);
this.ValidateStronglyTypedData(tDataType);
}
protected abstract ResultType ValidateStronglyTypedData(TDataType stronglyTypedData);
}
我有这个:
// Arrange
var mockSomeAbstractClass = new Mock<SomeAbstractClass<TestJsonDataType>>();
var testData = "{ 'testProperty': 'test value' }";
mockSomeAbstractClass.Protected().Setup<ValidationResult>("ValidateStronglyTypedData", It.IsAny<TestJsonDataType>());
// Act
mockSomeAbstractClass.Object.ValidateData(testData);
// Assert
mockSomeAbstractClass.Protected().Verify("ValidateStronglyTypedData", Times.Once(), It.IsAny<TestJsonDataType>());
但在运行时它抱怨它找不到该方法。是因为受保护的方法是抽象的吗?设置失败:
System.ArgumentException: '使用 ItExpr.IsNull 而不是 null 参数值,因为它会阻止正确的方法查找。'
我试过ItExpr 还是不行。我猜这与泛型类有关。
【问题讨论】:
-
当我使用
Moq时,为什么要创建抽象类的模拟实现?!这就是mockSomeAbstractClass对象应该是的。 -
你能包含实际的错误信息吗?
-
正如 nvoigt 所说,为什么不测试实际实现而不是测试抽象类?
-
你应该模拟依赖,而不是你正在测试的东西。