Rik*_*ard 7 c# abstract-class unit-testing moq
我的问题是我想在我的抽象类中存根一个属性,因为我在测试中的类使用了该属性.我目前正在使用最新版本的Moq.
我的抽象类看起来像这样:
public abstract class BaseService
{
protected IDrawingSystemUow Uow { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
我的测试课看起来像这样:
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;
}
}
Run Code Online (Sandbox Code Playgroud)
我无法弄清楚我怎么能破坏Uow财产.有人有任何线索吗?或者我的设计是不是很糟糕,我需要Uow在测试中转移到我的班级财产?
您当前的设置不会出于一个简单的原因 - Uow属性是不可覆盖的,此时Moq的工作已完成.无法覆盖,无法模拟.
最简单的解决方案是简单地使该属性可以覆盖.将基类定义更改为:
public abstract class BaseService
{
protected virtual IDrawingSystemUow Uow { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
现在您可以使用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(...);
Run Code Online (Sandbox Code Playgroud)