如何解决单元测试基于状态的测试 黑盒测试白盒测试
比方说,我有一个名为sizeof(unsigned long)
的方法和一个私有帮助程序方法CreateApplication
,该方法生成具有计算字段的应用程序对象。之后,我将生成的应用程序对象插入数据库。
GenerateApplication
在这种情况下,什么是适当的单元测试?我是否应该验证public async Task<Guid> CreateApplication(CreateApplicationdRequest request)
{
var application = GenerateApplication(request);
await UnitOfWork.Application.InsertAsync(application); // it's same as _db.Application.InsertAsync(application)
await UnitOfWork.CommitAsync(); // it's same as _db.SaveChangesAsync();
return application.Id;
}
方法(将应用程序插入数据库)并检查应用程序对象是否正确生成?
类似这样的东西:
InsertAsync
或者这不是正确的方法,对于这种情况,最好使用集成测试?
解决方法
有几种方法可以对方法进行单元测试。最受欢迎的两个是黑盒和白盒测试。
黑盒测试
您对实现一无所知。您只关心输出(包括返回值,输出参数和副作用)。因此,您想确保每当使用给定输入调用它时,您都会看到预期的输出。
在这种情况下,您的测试只会检查返回的Guid,并验证应用程序是否存储在模拟存储中。
Assert.NotEqual(result,Guid.Empty);
Assert.NotNull(x.Application.FirstOrDefault(app => app.Id == result));
这种方法可以很容易地扩展到集成测试,而不是使用模拟存储,而可以使用存储的沙盒版本。
白盒测试
您知道如何实现您的方法。并且您想确保您的代码不会发生任何不必要的事情,例如在GenerateApplication
和InsertAsync
方法调用之间覆盖Application的某些属性。
这可能是好事,也可能是坏事,具体取决于您对此的看法。假设您需要对PhoneNumber
进行归一化,并且无论出于何种原因都可以在CreateApplication
内执行此操作。从黑匣子的角度来看,这没关系(无需更新测试),因为功能没有改变。从白盒角度来看,您需要调整测试以模拟规范化器并验证其调用并声明预期的输出。
从回归的角度来看,前者可以被视为安全网,而后者可以被视为重构的安全网。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。