2014-11-25 92 views
0

我希望能夠在代碼處於開發中時提供來自存儲庫的僞造/模擬數據。也就是說,在調試時或在某臺CI計算機上,模擬數據被提供。使用Unity注入僞造數據DI

這樣我可以讓UI人員有一個「工作」服務來開始實現他們的用戶界面。或者測試人員可以提前開始測試。

我知道我可以將數據硬編碼到服務中。但是那個代碼在服務中,並且可能在服務準備就緒時(或者更糟的是,停留在那裏)被刪除。我想我可以重用這些模擬數據來進行單元測試,或者只是爲了使代碼更清晰。

所以我的問題:這是在Unity支持和/或有最佳做法嗎?或者這只是瘋狂的想法? :-)

回答

0

這是很多開發者遇到的非常常見的情況。

  1. 您使用DI。所以最重要的一點是你應該能夠配置你的容器來解決一個假實現,直到真正的服務準備就緒。正如你所說的,UI開發可以繼續,測試人員可以儘早開始測試。

  2. 當真正的實現進來時,你不想讓假數據再被提供給UI。因此配置你的容器來解決真正的實現。不要刪除假實施,因爲您可能永遠不會知道您將來可能需要它。這包括臨時服務不可用性,因此開發可以繼續使用假實現服務數據。

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

好吧,我同意你的觀點。很高興有這個驗證。但是,如何從技術上實現「切換」? – Sturla 2014-11-27 19:02:18

+0

@Sturla我用一些代碼和評論更新了我的答案。 – Spock 2014-11-28 05:24:57

+2

如果您在代碼中配置Unity,或者在app.config中配置統一功能,您可以使用預處理器指令(#if)來實現「切換」,該功能允許您無需重新編譯和/或使用多個app.config進行開發,測試,生產環境。 – jlvaquero 2014-11-28 08:28:56

相關問題