2013-10-09 46 views
0

美好的一天!請通過moq和c檢查我的單元測試#

我剛開始學習和練習做測試(不是TDD :))。 所以,我寫了一些小測試,但不知道 - 是對的嗎?它是綠色的,但我不能做它紅色(失敗)。

我用this msdn forum as example來做到這一點。

因此,我創建一個接口與一個功能。參數選項 - 帶有一些字段選項的對象。

public interface ICmdParseWrapper 
{ 
    String getName(ServiceArgs options); 
} 

public class CmdParserWrapper 
{ 
    private readonly ICmdParseWrapper dependency; 
    public CmdParserWrapper(ICmdParseWrapper dependency) 
    { 
     this.dependency = dependency; 
    } 
    public String ValidateGetName(ServiceArgs options) 
    { 
     return this.dependency.getName(options); 
    } 

    public static String getName(ServiceArgs options) 
    { 
    return (!String.IsNullOrEmpty(options.Name)) ? options.Name : "Error in getName! is null or empty"; 
    } 
} 

所以,我創建testMethod並且它通過了!但我不確定 - 我是對的嗎?我改變字符串「錯誤!」,但測試再次通過。 這裏這個類和測試方法。

[TestClass] 
public class UnitTest1 
{ 
    [TestMethod] 
    public void TestMethod_getName() 
    { 
     ServiceArgs options=new ServiceArgs(); 
     // options.ModeName=""; 

     var mock = new Mock<ICmdParseWrapper>(); 
     mock.Setup(foo=>foo.getName(options)).Returns("Error in getName! is null or empty"); 
     var testClass = new CmdParserWrapper(mock.Object); 
     String validateGetName = testClass.ValidateGetName(options); 
     mock.VerifyAll(); 
    } 
} 

請問,你能告訴我 - 測試是否正確?

回答

1

好開始,但有很多事情可以改善。我個人建議你做TDD,因爲它可以幫助你編寫好的單元測試。

可讀性 總是給出一個好的測試方法名稱。你不需要TestMethod,因爲它們是測試。 避免混淆名稱,如GetName。如果測試失敗,您不知道測試導致失敗的條件。最好的辦法是提供測試方法名稱

更多的上下文如果你想檢查GetName方法被調用

[TestMethod] 
    public void ValidateGetName_VerifyGetNameMethodIsCalled() 
    { 
     //Arrange  
     var mock = new Mock<ICmdParseWrapper>(); 
     var sut = new CmdParserWrapper(mock.Object); 

     //Act 
     sut.ValidateGetName(It.IsAny<ServiceArgs>()); 

     //Assert 
     mock.Verify(x => x.GetName(It.IsAny<ServiceArgs>())); 
    } 

而且你ValidateGetName方法不會有太大的問題。它只是調用另一個服務方法。以下設置是不需要的。

 mock.Setup(foo=>foo.getName(options)).Returns("Error in getName! is null or empty"); 
+0

以及如何失敗測試?他通過了,即使我在fuc getName中返回null .. – user2545071

+1

根據驗證,如果您的系統受測試中未調用dependency.GetName(options)方法,則此測試將失敗。請記住,您沒有測試dependency.GetName(options)中的行爲。你的依賴被嘲笑。你真正測試的是CmdParserWrapper.ValidateGetName(options)方法的行爲。 – Spock