7

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

我的抽象类如下所示:

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财产转移到我的班级进行测试?

4

2 回答 2

11

由于一个简单的原因,您当前的设置将无法正常工作 -Uow属性是不可覆盖的,并且 Moq 的工作此时已完成。不能覆盖,不能模拟

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

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

现在您可以使用 Moq 的受保护功能(这需要您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(...);
于 2012-09-16T21:34:04.707 回答
0

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

于 2012-09-17T07:30:07.897 回答