单元测试类中的IOC-Unity.WebApi

时间:2018-11-15 14:52:47

标签: c# unit-testing asp.net-web-api inversion-of-control

我已经在Web api项目中成功实现了Unity.WebAPI。一些如何不创建MService类的新实例的方法。运行单元测试方法时,出现以下错误消息。

  

无法获取类MServiceTests的默认构造函数。

服务等级

    private readonly IRepository _mRepository;

    public MService(IMRepository mRepository)
    {
        _mRepository = mRepository;
    }

     public List<FUser> GetFUser()
    {
      result = _mRepository.ExecuteCommandReader()
    }

测试类

 public class MServiceTests
{
    private readonly IMRepository _mRepository;
    private readonly IMService _mService;


    public MServiceTests(IMRepository mRepository, IMService mService)
    {
        _mRepository = mRepository;
        _mService = mService;
    }




    [TestMethod]
    public void Get_Users_ReturnsUserList()
    {

        var resultList = new List<FUser>();
        resultList = _mService.GetFUser();

        Assert.IsTrue(resultList.Count > 0);

    }
}

UnityConfig

    container.RegisterType<IFService, FService>(new HierarchicalLifetimeManager());
    container.RegisterType<IMService, MService>(new HierarchicalLifetimeManager());
    container.RegisterType<ITransactionService, TransactionService>(new HierarchicalLifetimeManager());
    container.RegisterType<IMRepository, MRepository>();

2 个答案:

答案 0 :(得分:2)

关于如何对具有依赖项的类进行单元测试似乎有些困惑。

让我们假设被测对象看起来像这样

public class MService: IMService {

    private readonly IMRepository mRepository;

    public MService(IMRepository mRepository) {
        this.mRepository = mRepository;
    }

    public List<FUser> GetFUser() {
        var result = mRepository.ExecuteCommandReader();
        return result
    }
}

为了测试MService.GetFUser,您将创建主题类MService的实例,并注入需要的依赖项来测试被测方法的行为。

在以下示例测试中,将使用Moq模拟框架对依赖项进行模拟。如果需要,您可以轻松地创建一个伪造的实现。

[TestClass]
public class MServiceTests {   
    [TestMethod]
    public void Get_Users_ReturnsUserList() {
        //Arrange 
        var expected = new List<FUser>() {
            //populate with some users
        };
        IMRepository mockRepository = new  Mock<IMRepository>();
        mockRepository.Setup(_ => _.ExecuteCommandReader()).Returns(expected);

        IMService mService = new MService(mockRepository.Object);

        //Act
        var resultList = mService.GetFUser();

        //Assert
        Assert.IsTrue(resultList.Count > 0);    
    }
}

您最初遇到问题的原因是测试运行程序无法创建测试类,因为它(运行程序)不是为了执行DI而构建的。

为了测试主题类,您需要创建该类的实例,并注入测试测试方法的行为所需的所有依赖项。

真的不需要使用容器进行如此小的隔离测试

答案 1 :(得分:1)

您缺少测试类的[TestClass]属性(假设您正在使用MSTest框架)。 测试类需要具有一个空的默认构造函数,或者根本不需要任何构造函数。

要设置测试,您可以按照自己的方式安排

  1. 手动创建所需的实例或
  2. 使用模拟框架或
  3. 像在应用程序中一样对依赖项注入执行相同的初始化,然后根据需要解析实例

也许您还想看看单元测试的Arrange-Act-Assert模式: (请参阅http://defragdev.com/blog/?p=783

还请记住,您只想测试代码而不是DI框架。