2014-12-23 4 views
1

FakeItEasy fake 개체로 메서드를 테스트하고 있습니다. 가짜 개체는 MemoryStream입니다.FakeItEasy 설치 개체가 테스트 메서드에서 반환되지 않습니다.

[TestFixture] 
public class ServerClientTests 
{ 
    private IWebClient webClient; 
    private ServerClient serverClient; 

    [SetUp] 
    public void Setup() 
    { 
     webClient = A.Fake<IWebClient>(); 
     serverClient = new ServerClient(webClient); 

     var responseStreamBytes = Encoding.Default.GetBytes("OK"); 
     var responseStream = new MemoryStream(); 
     responseStream.Write(responseStreamBytes, 0, responseStreamBytes.Length); 
     responseStream.Seek(0, SeekOrigin.Begin); 

     var response = A.Fake<WebResponse>(); 
     A.CallTo(() => response.GetResponseStream()).Returns(responseStream); 

     var request = A.Fake<WebRequest>(); 
     A.CallTo(() => request.GetResponse()).Returns(response); 

     A.CallTo(() => webClient.GetRequest("http://localhost:8080/myserver")).Returns(request); 

    } 

     [Test] 
     public void Test1() 
     { 
      var result = serverClient.GetRequest("http://localhost/myserver"); 

      Assert.AreEqual(2, result.Length); 
     } 
    } 

그리고 이것은 테스트중인 코드입니다 : 내가 테스트를 실행하면

public interface IWebClient 
{ 
    WebRequest GetRequest(string url); 
} 

public class ServerClient 
{ 
    private readonly IWebClient client; 

    public ServerClient(IWebClient client) 
    { 
     this.client = client; 
    } 

    public Stream GetRequest(string url) 
    { 
     return client.GetRequest(url).GetResponse().GetResponseStream(); 
    } 
} 

, 그것은 제공 테스트 예외 =>예상 : 2 그러나이었다 : 0

내가 브레이크 포인트를 넣어 설정 방법 및 디버그 테스트에서 가짜 요청 GetResponse() 메소드가 스트림과 함께 응답을 리턴하는 것을 볼 수 있습니다. 그 길이 스트림 길이

0이 FakeItEasy에 대한 설정이 있습니다,

그러나 시험 방법 2.입니까? 또는 나는 어디에서 틀린가? webClient이를 반환 있도록

+0

이해가 안을 말한 것입니다. 문서를 원한다면 [FakeItYasy 홈페이지] (http://fakeiteasy.github.io/)에서 링크 된 https://github.com/FakeItEasy/FakeItEasy/wiki에서 문서를 찾을 수 있습니다. –

답변

3

당신은

A.CallTo(() => webClient.GetRequest("http://localhost:8080/myserver")) 
         .Returns(request); 

을 설정하지만 그때는 webClient.GetRequest이 기대 ("http://localhost8080/myserver")와 일치하지 않는, "http://localhost/myserver"을 전달

serverClient.GetRequest("http://localhost/myserver"); 

그래서 전화하는거야 가짜 MemoryStream 자체 고안, 기본 동작입니다.

두 URL을 동일하게 지정할 수 있습니다. 또는 가짜 webClient이 하나의 URL 이상으로 반응하도록하려면 더 정교한 argument matchers을 사용할 수 있습니다.

미래에 구성된 방법이 원하는 방식으로 작동하지 않는 이유에 대해 혼란이 생길 ​​경우 MustHaveHappened에 대한 호출을 사용하여 FakeItEasy가 메서드가 호출되었다고 생각하는지 확인하십시오. 우리는 FakeItEasy의 오류 메시지가이 상황에서 도움이된다는 것을 잘 알고 있다고 생각합니다. 당신이

[Test] 
public void Test2() 
{ 
    var result = serverClient.GetRequest("http://localhost/myserver"); 

    A.CallTo(() => webClient.GetRequest("http://localhost:8080/myserver")) 
     .MustHaveHappened(); 
} 

같은 테스트를 추가했던 경우 경우

는, 그것은 "이 FakeItEasy에 대한 설정이다?"

Assertion failed for the following call: 
    FakeItEasyQuestions.IWebClient.GetRequest("http://localhost:8080/myserver") 
Expected to find it at least once but found it #0 times among the calls: 
    1: FakeItEasyQuestions.IWebClient.GetRequest(url: "http://localhost/myserver") 
+0

하지만 생성자 [serverClient = new ServerClient (webClient);]에 설정되어 있으므로 serverClient.GetRequest()가 클래스의 webClient를 호출합니다. – barteloma

+0

이것은 내 매개 변수 문제입니다. 감사 – barteloma