c# - 对从抽象类继承的类进行单元测试

标签 c# unit-testing moq abstract-class

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

我的抽象类如下所示:

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

我不知道如何 stub Uow 属性。有人有任何线索吗?还是我的设计太糟糕以至于我需要将 Uow 属性移至我的测试类?

最佳答案

您当前的设置将无法工作,原因很简单 - 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(...);

关于c# - 对从抽象类继承的类进行单元测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12450768/

相关文章:

unit-testing - 运行多个测试时优化 Arquillian 性能

javascript - Jest : select an HTML element through innerHTML

c# - 如何对此进行单元测试?具有大量数据库调用的大 foreach

c# - 如何从标签中删除数据

c# - 如何在 asp.net 中的回发中获取 html 控件的值

asp.net - 如何编写单元测试来测试 ASP.NET Web 表单应用程序的 CSRF 漏洞?

c# - XUnit、AutoFixture 和 Moq 最佳实践

c# - C# 中的最小起订量和文件/数据保存

c# - Nodatime BclDateTimeZone EqualsImpl 抛出 NotImplementedException

c# - 这个派生接口(interface)getter有什么歧义?