我的问题是我想在我的抽象类中 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/