无法模拟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 模式和实体框架模拟

UnitOfWork

[Doctrine2] 刷新失败但 unitOfWork 进程正确

EF + UnitOfWork + SharePoint RunWithElevatedPrivileges

无法通过接口获取与片段通信的活动

一个函数应该返回什么可以失败?