无法模拟unitOfWork和没有服务接口
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了无法模拟unitOfWork和没有服务接口相关的知识,希望对你有一定的参考价值。
我有以下课程
namespace Foo.Bar.Services
{
public abstract class Service
{
public Service(IUnitOfWork unitOfWork)
{
this.UnitOfWork = unitOfWork;
}
protected IUnitOfWork UnitOfWork { get; private set; }
}
}
using...
namespace Foo.Bar.Services
{
public class ControlService : Service
{
...
private readonly IRepository<GroupStructure> groupStructures = null;
public ControlService(IUnitOfWork uow) : base(uow)
{
...
this.agencyGroupStructures = this.UnitOfWork.GetRepository<AgencyGroupStructure>();
}
public Tuple<bool, int> HasExternalImage(int branchId)
{
var externalResultList = from a in this.Structures.Table
where a.GroupID == branch.GroupID
&& (a.AreExternalRequired == true)
&& (a.ProductTypeID == ETourType.Trailer)
&& !a.Deleted
select a;
return (some logic based on above...)
}
}
并测试
namespace ControlTests
{
[TestFixture]
public class Control
{
//unable to create service due to being abstact
[Test]
public void TestMethod1()
{
******Changed here******
var Mock = new Mock<GroupStructureService> { CallBase = true };
var fakeControl = new ControlService(Mock.Object)
var sut = fakeControl.HasExternalImage(1249);
Assert.That(sut.Item1, "true");
}
}
}
使用NUnit和Moq运行上面的内容会显示以下消息:
Castle.DynamicProxy.InvalidProxyConstructorArgumentsException:无法实例化类的代理:Foo.Bar.Services.ControlService。 找不到无参数构造函数。
我已经尝试了一些东西,但我无法获得这个以前未经测试的应用程序来创建一个模拟对象进行测试
编辑,谢谢。所以我把它改为使用ControlService和mock 1依赖。但它的错误在于它无法从...... GroupStructure转换为Foo.Bar.IUnitOfWork
答案
通常,被测系统不会被模拟。模拟其依赖项并将其注入到测试类的实例中
[TestFixture]
public class Control {
[Test]
public void TestMethod1() {
//Arrange
var repository = new Mock<IRepository<GroupStructure>>();
//...Set up the repository behavior to satisfy logic
var uow = new Mock<IUnitOfWork>();
uow.Setup(_ => _.GetRepository<AgencyGroupStructure>())
.Returns(repository.Object);
var sut = new ControlService(uow.Object);
var expected = true;
//Act
var actual = sut.HasExternalImage(1249);
//Assert
Assert.AreEqual(actual.Item1, expected);
}
}
参考Moq Quickstart以更好地理解如何使用模拟框架。
以上是关于无法模拟unitOfWork和没有服务接口的主要内容,如果未能解决你的问题,请参考以下文章
UnitOfWork + Repository 模式和实体框架模拟
[Doctrine2] 刷新失败但 unitOfWork 进程正确