单元测试检索方法 - 冗余?

Nul*_*nce 3 .net c# unit-testing mocking xunit.net

我的服务层中有以下方法

public ModuleResponse GetModules(ModuleRequest request)
{
    var response = new ModuleResponse(request.RequestId);
    try
    {
        response.Modules = Mapper.ToDataTransferObjects(ModuleDao.GetModules());
        return response;
    }
    catch (Exception ex)
    {
        Log.Error(ex);
        response.Acknowledge = AcknowledgeType.Failure;
        response.Message = "An error occured.";
        return response;
    }
}
Run Code Online (Sandbox Code Playgroud)

我有一个用xUnit编写的单元测试,如下所示:

[Fact]
public void GetModulesTest()
{
    //Arrange            
    var mockModuleDao = Mock.Create<IModuleDao>();
    var mockLog = Mock.Create<ILog>();
    var mockAuditDao = Mock.Create<IAuditDao>();

    var moduleList = new List<ModuleItem>
    {
        new ModuleItem {Id = 100, Category = "User Accounts", Feature = "Users"},
        new ModuleItem {Id = 101, Category = "User Accounts", Feature = "Roles Permissions"}
    };

    mockModuleDao.Arrange(dao => dao.GetModules()).Returns(moduleList);

    IUserManagementService userService = new UserManagementService(mockModuleDao, mockLog, mockAuditDao);

    var request = new ModuleRequest().Prepare();

    //Act
    var actualResponse = userService.GetModules(request);

    //Assert
    Assert.Equal(AcknowledgeType.Success, actualResponse.Acknowledge);
    Assert.Equal(2, actualResponse.Modules.Count);
}
Run Code Online (Sandbox Code Playgroud)

现在,我的代码中有另外一组检索方法,类似于上面的方法.

测试此类方法是多余的吗?我的意思是,它们几乎是一个肯定的通过测试,除非我弄乱了我的Mapping或其他东西的逻辑.

此外,在测试检索方法时,我应该测试什么?在上面的场景中,我有2个断言语句,1个用于检查响应是否成功,第2个用于检查列表的计数.

这够了吗?或者如何进一步改进以提高这种单元测试的价值?

Mar*_*ann 5

与往常一样,这样的测试是否有价值取决于您的测试动机.

  • 这段代码是否对任务至关重要?
  • 如果代码失败,成本是多少?
  • 如果发生错误,你能轻易解决错误吗?

失败的成本越高,测试一段代码就越重要.

GetModules方法至少做了四件事:

  • 它返回DAO中的模块.
  • 它将DAO中的模块映射到所需的返回类型.
  • 如果出现问题,它会返回错误消息.
  • 它记录可能发生的任何错误.

所述GetModulesTest测试单个的这四个责任,这意味着其他三个测试仍需要完全覆盖GetModules方法.

编写小粒度单元测试很有价值,因为它可以将复杂的生产代码分解为一组简单易懂的单元测试.有时候,这些单元测试几乎变得非常简单,直到你开始怀疑它的价值,但是价值不在单个单元测试中 - 它是在简单测试的累积中,它们一起指定整个系统应该如何运作.