2017-05-16 63 views
1

請參閱下面的代碼:斷言和驗證兩個失敗

[TestClass] 
public class UnitTest1 
{ 
    Moq.Mock<ISayGoodMorning> GoodMorningMock; 

    [TestInitialize] 
    public void init() 
    { 
     GoodMorningMock = new Moq.Mock<ISayGoodMorning>(); 
     GoodMorningMock.Setup(x => x.GoodMorning()).Returns(Test()); 
    } 

    [TestMethod] 
    public void TestMethod1() 
    { 
     GoodMorningMock.Verify(x => x.GoodMorning(), Times.Once()); 
     Assert.AreEqual(g.SayGreeting(), "Hola");   
    } 

    public string Test() 
    { 
     return "Hola"; 
    } 
} 

斷言和驗證失敗。這是爲什麼?下面是被測試的代碼:

namespace ClassLibrary1 
{ 
    public class SayGoodMorning : ISayGoodMorning 
    { 
     public string GoodMorning() 
     { 
      return "Good Morning"; 
     } 
    } 

    public interface ISayGoodMorning 
    { 
     string GoodMorning(); 
    } 
} 

namespace ClassLibrary2 
{ 
    public class Greeting 
    { 
     public string SayGreeting() 
     { 
      ISayGoodMorning s = new SayGoodMorning(); 
      return s.GoodMorning(); 
     } 
    } 
} 
+0

您嘗試在實際調用方法之前進行驗證,然後在測試類使用「早安」時調用期望「Hola」的方法。 – Eris

回答

0

首先被測對象需要被重構爲注射的依賴性,以允許一個模擬測試時使用。通過構造函數或方法注入。 (Explicit Dependencies Principle

這個例子使用構造器注入

namespace ClassLibrary2 { 
    public class Greeting { 
     private readonly ISayGoodMorning speaker; 

     public Greeting(ISayGoodMorning speaker) { 
      this.speaker = speaker; 
     } 

     public string SayGreeting() { 
      return speaker.GoodMorning(); 
     } 
    } 
} 

接着測試需要重組使得Verify正在鍛鍊被測方法之後進行;

[TestClass] 
public class UnitTest1 { 
    Mock<ISayGoodMorning> GoodMorningMock; 

    [TestInitialize] 
    public void init() { 
     //Arrange 
     GoodMorningMock = new Mock<ISayGoodMorning>(); 
     GoodMorningMock.Setup(_ => _.GoodMorning()).Returns(Test()); 
    } 

    [TestMethod] 
    public void TestMethod1() { 
     //Arrange cont'd 
     var g = new ClassLibrary2.Greeting(GoodMorningMock.Object); 
     var expected = "Hola"; 

     //Act 
     var actual = g.SayGreeting(); 

     //Assert 
     GoodMorningMock.Verify(_ => _.GoodMorning(), Times.Once()); 
     Assert.AreEqual(expected, actual); 
    } 

    public string Test() { 
     return "Hola"; 
    } 
} 
+0

謝謝。如果您正在模擬WCF服務參考,您是否必須執行此操作? – w0051977

+0

我不明白你的意思。服務引用應該在您控制的類型後面抽象出來,以便維護和測試更加靈活。將其視爲第三方依賴關係。 – Nkosi

+0

是的,默認情況下是:Service.svc和IService.svc。儘管這個模擬不是被注入到服務中的。那有意義嗎? – w0051977