Skip to main content
 首页 » 编程设计

c#之UnitTest 类中的 IOC之Unity.WebApi

2024年02月25日34EasonJim

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

Unable to get default constructor for class 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); 
 
    } 
} 

Unity配置

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

请您参考如下方法:

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

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

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 的实例,并注入(inject)测试方法行为所需的任何依赖项测试。

在下面的示例测试中,将使用 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 而构建的。

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

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