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

IOC in UnitTest class - Unity.WebApi

我已经在 web api 项目中成功实现了 Unity.WebAPI。 MService class 的新实例未创建的一些方式。我在 运行 单元测试方法时收到以下错误消息。

Unable to get default constructor for class MServiceTests.

服务Class

    private readonly IRepository _mRepository;

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

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

测试Class

 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>();

您在测试 class 中缺少 [TestClass] 属性(假设您使用的是 MSTest 框架)。 测试 classes 需要有一个空的默认构造函数或根本没有构造函数。

要设置测试,您可以按照您

的方式进行安排
  1. 手动创建所需实例或
  2. 使用模拟框架或
  3. 就像在您的应用程序中关于依赖注入一样进行相同的初始化,然后根据需要解析实例

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

另外请记住,您更想测试代码而不是 DI 框架。

关于如何对具有依赖性的 class 进行单元测试似乎有些混乱。

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

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 您将创建主题 class 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);    
    }
}

测试运行器无法创建测试的最初问题的原因 class 因为它(运行器)不是为 DI 构建的。

为了测试主题 class,您需要创建 class 的实例并注入测试被测方法行为所需的任何依赖项。

这么小的孤立测试真的没必要用容器