【问题标题】:Unit testing a class that inherits from an abstract class对继承自抽象类的类进行单元测试
【发布时间】:2012-09-16 21:11:09
【问题描述】:

我的问题是我想在我的抽象类中存根一个属性,因为我的测试类使用该属性。我目前使用的是最新版本的起订量。

我的抽象类如下所示:

public abstract class BaseService
{
    protected IDrawingSystemUow Uow { get; set; }
}

我在测试中的班级看起来像这样:

public class UserService : BaseService, IUserService
{
    public bool UserExists(Model model)
    {
        var user = this.Uow.Users.Find(model.Id);
        if(user == null) { return false; }

        reurn true;
    }
}

我不知道如何存根 Uow 属性。有人有任何线索吗?还是我的设计很糟糕,我需要将Uow 属性转移到我的测试类?

【问题讨论】:

    标签: c# unit-testing moq abstract-class


    【解决方案1】:

    由于一个简单的原因,您当前的设置无法正常工作 - Uow 属性是不可覆盖的,此时 Moq 的工作已完成。 Cannot override, cannot mock.

    最简单的解决方案是简单地使该属性可覆盖。将基类定义更改为:

    public abstract class BaseService
    {
        protected virtual IDrawingSystemUow Uow { get; set; }
    }
    

    现在您可以使用 Moq 的 protected 功能(这需要您在测试类中包含 using Moq.Protected 命名空间):

    // at the top of the file
    using Moq.Protected;
    
    // ...
    
    var drawingSystemStub = new Mock<IDrawingSystemUow>();
    var testedClass = new Mock<UserService>();
    testedClass 
      .Protected()
      .Setup<IDrawingSystemUow>("Uow")
      .Returns(drawingSystemStub.Object);
    
    // setup drawingSystemStub as any other stub
    
    // exercise test
    var result = testedClass.Object.UserExists(...);
    

    【讨论】:

    • 非常感谢,它真的很有帮助!这是您的代码 sn-p 中的一个小错误。 Returns(drawingSystemStub) 应替换为 Returns(drawingSystemStub.Object)。 =)
    • 仅供参考 @jimmy_keen -“无法覆盖,无法模拟”的链接已损坏
    【解决方案2】:

    我认为你的情况很简单。您只是不模拟 Uow 属性,而是模拟 IDrawingSystemUow 服务。所以你可以创建一个IDrawingSystemUow 的模拟,通过Uow 属性将它分配给UserService 的实例,然后运行测试(例如UserExists 方法)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-12-19
      • 1970-01-01
      • 2010-09-11
      • 1970-01-01
      • 2012-06-14
      • 2015-04-07
      • 2019-06-08
      • 1970-01-01
      相关资源
      最近更新 更多