使用Unity DI注入假数据

时间:2014-11-25 11:08:08

标签: mocking unity-container repository-pattern

我希望能够在代码处于开发状态时从存储库提供伪造/模拟数据。也就是说,在调试时或在某些CI机器上,模拟数据会被提供。

通过这种方式,我可以让UI人员进行“工作”#34;服务开始实现他们的UI。或者测试人员可以提前开始测试。

我知道我可以将数据硬编码到服务中。但随后该代码在服务中,并且可能在服务准备就绪时被删除(或者更糟糕的是,留在那里)。我认为我可以将这些模拟数据重用于例如单元测试,或者只是为了使代码更清晰。

所以我的问题:这是Unity支持的内容和/或是否有最佳实践?或者这只是疯狂的想法?: - )

1 个答案:

答案 0 :(得分:0)

这是许多开发人员遇到的非常常见的情况。

  1. 您正在使用DI。因此,最重要的一点是,您应该能够配置容器以解决Fake实现,直到实际服务准备就绪。正如您所提到的,UI dev可以继续,测试人员可以尽早开始测试。

  2. 当真正的实现出现时,您不希望将虚假数据再次提供给UI。因此,配置容器以解决实际实现。不要删除Fake实现,因为您可能永远不会知道将来可能需要它。这包括临时服务不可用,因此开发可以继续使用假实现服务数据。

  3. 这是最重要的部分。我不建议您将假数据与单元测试混合使用。保持测试完全隔离,提供测试假数据(绝对必要)驻留在单元测试项目中。假设您决定在测试中重复使用生产假货,那么您的测试可能会因为错误的原因而失败。例如,无效的数据设置。这也可能是维护问题。例如,有人可能决定删除虚假数据,因为真实服务是稳定的。现在,如果测试依赖于这些文件,则会出现问题。您希望保持测试数据独立于其他虚假数据。

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