我希望能够在代码处于开发状态时从存储库提供伪造/模拟数据。也就是说,在调试时或在某些CI机器上,模拟数据会被提供。
通过这种方式,我可以让UI人员进行“工作”#34;服务开始实现他们的UI。或者测试人员可以提前开始测试。
我知道我可以将数据硬编码到服务中。但随后该代码在服务中,并且可能在服务准备就绪时被删除(或者更糟糕的是,留在那里)。我认为我可以将这些模拟数据重用于例如单元测试,或者只是为了使代码更清晰。
所以我的问题:这是Unity支持的内容和/或是否有最佳实践?或者这只是疯狂的想法?: - )
答案 0 :(得分:0)
这是许多开发人员遇到的非常常见的情况。
您正在使用DI。因此,最重要的一点是,您应该能够配置容器以解决Fake实现,直到实际服务准备就绪。正如您所提到的,UI dev可以继续,测试人员可以尽早开始测试。
当真正的实现出现时,您不希望将虚假数据再次提供给UI。因此,配置容器以解决实际实现。不要删除Fake实现,因为您可能永远不会知道将来可能需要它。这包括临时服务不可用,因此开发可以继续使用假实现服务数据。
这是最重要的部分。我不建议您将假数据与单元测试混合使用。保持测试完全隔离,仅提供测试假数据(绝对必要)驻留在单元测试项目中。假设您决定在测试中重复使用生产假货,那么您的测试可能会因为错误的原因而失败。例如,无效的数据设置。这也可能是维护问题。例如,有人可能决定删除虚假数据,因为真实服务是稳定的。现在,如果测试依赖于这些文件,则会出现问题。您希望保持测试数据独立于其他虚假数据。
public interface IWebService
{
string GetData();
}
public class RealWebService : IWebService
{
public string GetData()
{
//please don't use. More work happening
throw new NotImplementedException();
}
}
//avoid using this for the testing. It is only a replacement until the new service in place.
public class FakeWebService : IWebService
{
public string GetData()
{
return "faleData";
}
}
class Program
{
static void Main(string[] args)
{
var container = new UnityContainer();
//TODO: Un comment this when the RealWebService implementation is ready to consume.
//container.RegisterType<IWebService, RealWebService>()
//TODO: Remove this once the RealWebService implementation is ready to consume.
container.RegisterType<IWebService, FakeWebService>();
//return the fake implementation so...
// As you have mentioned UI dev can continue, and testers can start testing early.
var webService = container.Resolve<IWebService>();
webService.GetData();
}
}