2013-04-02 154 views
1

我有小樣本工廠模式實現的下方,並想知道如果有人可以幫我寫正確的起訂量的單元測試用例,最大代碼覆蓋率:測試工廠模式

public class TestClass 
{ 
    private readonly IService service; 

    public TestClass(Iservice service) 
    { 
     this.service = service; 
    } 

    public void Method(string test) 
    { 
     service = TestMethod(test); 
     service.somemethod(); 
    } 

    private IService TestMethod(string test) 
    { 
     if(test == 'A') 
      service = new A(); 
     if(test == 'B') 
      service = new B(); 
     return service; 
    } 
} 

我尋找一些幫助測試TestClass中,更重要的TestMethod的時候我送模擬,例如我的測試方法低於:

[TestMethod] 
public void TestCaseA() 
{ 
    Mock<IService> serviceMock = new Mock<Iservice>(MockBehaviour.strict); 
    TestClass tClass = new TestClass(serviceMock.Object); 

    // The Question is, what is best approach to test this scenario ? 
    // If i go with below approach, new A() will override serviceMock 
    // which i am passing through constructor. 
    var target = tClass.Method("A"); 
} 

回答

5

你不會嘲笑TestClass,因爲那是你正在測試的內容。

要使用此功能,您需要爲service設置一個只讀屬性。

public IService Service { get; private set; } 

您需要測試,無論是構造和Method修改(在這種情況下Service)的TestClass實例的狀態的方式。

您的測試看起來會像對B測試用例測試Method如下:

[TestMethod] 
public void TestSomeMethod() 
{ 
    // Arrange/Act 
    var target = new TestClass((new Mock<IService>()).Object); 
    target.Method("B"); 

    // Assert 
    Assert.IsInstanceOfType(target.Service, typeof(B)); 
} 

你的測試將類似於用於測試的構造函數A測試情況如下:

[TestMethod()] 
public void TestCasesA() 
{ 
    // Arrange/Act 
    var target = new TestClass("A"); 

    // Assert 
    Assert.IsInstanceOfType(target.service, typeof(A)); 
} 

我會建議只使用構造函數的方法來注入你的IService。這可以讓你有一個不可變的對象,這將減少你的應用程序的狀態。

+0

我想,我不清楚我的問題。假設我有一個構造函數,在這裏我發送Iservice(當我測試時,我可以將它用於模擬(Iservice))。我的主要問題是熱我可以測試方法(字符串),初始化構造函數?我發送的模擬服務將由TestMethod完成。 – Aravind

+0

@ user2237300我不知道你在做什麼。你能否更新你的問題以使其更清楚? –

+0

我已更新我的問題,請告訴我,如果它清楚? – Aravind