2017-05-16 3 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

실제로 메서드를 호출하기 전에 확인한 다음 테스트 클래스에서 "Good Morning"을 사용할 때 "Hola"를 예상하는 메서드를 호출합니다. – Eris

답변

0

먼저 테스트 할 때 모의 객체를 사용하여 테스트 할 때 모의 객체를 사용할 수 있도록해야합니다. 생성자 또는 메소드 삽입을 통해. (Explicit Dependencies Principle)

이 예에서는 테스트가 Verify이 시험 방법 운동 후에 수행되도록 재구성되어야 생성자에게 주입

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

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

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

다음을 사용;

[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

무슨 뜻인지 이해가 안됩니다. 서비스 참조는 유지 및 테스트의 유연성이 향상되도록 제어하는 ​​유형 뒤에 추상화되어야합니다. 제 3 자 종속성으로 간주하십시오. – Nkosi

+0

예, 있습니다 : Service.svc 및 IService.svc 기본적으로. 그러나 모의는 서비스에 주입되지 않습니다. 말이 돼? – w0051977