单元测试从抽象类继承的类

时间:2012-09-16 21:11:09

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

我的问题是我想在抽象类中存根一个属性,因为我在测试中的类使用了该属性。我目前正在使用最新版本的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;
    }
}

我无法弄清楚如何存根Uow属性。有人有任何线索吗?或者我的设计是不是很糟糕,我需要在测试中将Uow属性移到我的班级?

2 个答案:

答案 0 :(得分:9)

您当前的设置无法正常工作 - 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(...);

答案 1 :(得分:0)

我认为在你的情况下,它非常简单。您只是不要模拟Uow属性,而是IDrawingSystemUow服务。因此,您可以创建IDrawingSystemUow的模拟,通过UserService属性将其分配给Uow的实例,然后运行测试(例如UserExists方法)。 / p>