【问题标题】:Testing abstract class with Moq, without the need of defining fake implementation classes使用 Moq 测试抽象类,无需定义假实现类
【发布时间】: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 所说,为什么不测试实际实现而不是测试抽象类?
  • 你应该模拟依赖,而不是你正在测试的东西。

标签: c# moq


【解决方案1】:

我会说既然你可以做真实的事情,为什么还要打扰所有的嘲笑呢?

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

【讨论】:

  • 因为我想我可以通过Moq“免费”获得。
  • 起订量似乎要复杂得多。 Mocking 是一种工具,在需要时使用。确保不要仅仅因为安装了“锤子”就将所有东西都视为钉子。有时,最简单的方法是不使用所有工具。
猜你喜欢
  • 2014-01-02
  • 2015-08-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-08
  • 2010-09-16
  • 2011-01-24
相关资源
最近更新 更多