Тестирование абстрактного класса с Moq без необходимости определения поддельных классов реализации - PullRequest
0 голосов
/ 25 сентября 2018

У меня есть этот абстрактный класс, который я хочу проверить.Я хочу убедиться, что при вызове 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 вместо нулевого значения аргумента, поскольку он препятствует правильному поиску метода.'

Iпытался ItExpr и до сих пор не работает.Я предполагаю, что это связано с тем, что класс является родовым.

1 Ответ

0 голосов
/ 25 сентября 2018

Я бы сказал, зачем вам все эти насмешки, когда вы можете просто делать что-то реальное?

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);    
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...