我有一个要测试的抽象类。我想确保在调用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
,但仍然无法正常工作。我想这与泛型有关。
答案 0 :(得分:3)
我想说的是,当您只能做真实的事情时,为什么还要打扰所有这些嘲笑?
public class TestClass
{
private class DerivedTest : SomeAbstractClass<string>
{
public bool WasCalled { get; private set; }
protected override ResultType ValidateStronglyTypedData(string stronglyTypedData)
{
this.WasCalled = true;
}
}
[YourFavoriteFrameWorkAttributeForTestMethod]
public void TestMethod()
{
// arrange
var instance = new DerivedTest();
// act
var result = instance.SomeMethod("test");
// assert
Assert.IsTrue(instance.WasCalled);
}
}