使用Moq测试抽象类,而无需定义伪造的实现类

时间:2018-09-25 13:41:58

标签: c# moq

我有一个要测试的抽象类。我想确保在调用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,但仍然无法正常工作。我想这与泛型有关。

1 个答案:

答案 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);    
    }
}