2014-12-23 3 views
1

Я тестирую метод с FakeItEasy поддельный объект. Поддельный объект - 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

я ставлю точку останова в методе установки и тестировании отладки. Я вижу, что метод Fake request GetResponse() возвращает ответ с потоком. Это Длина равна 2.

Но в методе испытания, поток Длина 0.

Есть ли какие-либо настройки о FakeItEasy? Или где я ошибаюсь?

+0

Я не понимаю «есть какие-либо настройки около FakeItEasy?». Если вы имеете в виду документацию, вы можете найти ее на странице https://github.com/FakeItEasy/FakeItEasy/wiki, связанной с [домашней страницей FakeItEasy] (http://fakeiteasy.github.io/). –

ответ

3

Вы настраиваете

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

но затем вызывая

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

Итак, webClient.GetRequest передается "http://localhost/myserver", который не соответствует его ожиданиям ("http://localhost8080/myserver"), поэтому webClient возвращает подделка 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(); 
} 

Было бы сказал

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

Смежные вопросы