簡體   English   中英

使用Moq測試抽象類,而無需定義偽造的實現類

[英]Testing abstract class with Moq, without the need of defining fake implementation classes

我有這個抽象類,我想測試。 我想確保在調用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 ,但仍然無法正常工作。 我猜想這與泛型類有關。

我想說的是,當您可以做真實的事情時,為什么還要打擾所有這些嘲笑呢?

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM