2013-11-28 3 views
2

Я новичок в Nunit.please для написания тестового примера. это мой классНаписание тестов NUnit для метода

public CommandModule(ICommandFetcher fetcher,ICommandBus commandBus) 
    { 

     //Get["/"] = p => 
     //{z 
     // return Response.AsText((string)Request.Form.Username); 
     //}; 

     Post["/"] = parameters => 
     { 
      var commandRequest = this.Bind<MessageEnvelope>(); 
      var command = fetcher.FetchFrom(commandRequest); 
      commandBus.Send((ICommand)command, commandRequest.MetaData); 
      return HttpStatusCode.OK; 
     }; 
    } 
} 

и я хочу, чтобы проверить этот метод проверки

commandBus.Send((ICommand)command, commandRequest.MetaData); 

спасибо!

я попробовать это следующим образом

[Test] 
    public void whern_reseiving_command_it_sent_to_the_command_bus() 
    { 

     var rCommand = new DummyCommand() { SomeProp = 2 }; 
     var serializedCommand = JsonConvert.SerializeObject(rCommand); 
     var envelope = new MessageEnvelope() { MetaData = new MetaData() { MessageType = "DummyCommand", MessageTypeVersion = 1 }, MessageData = serializedCommand }; 
     var fakeCommand = A.Fake<ICommandBus>(); 

     var browser = new Browser(with => 
     { 
      with.Module<CommandModule>(); 
      with.Dependency<ICommandBus>(fakeCommand); 

     }); 

     var result = browser.Post("/", with => 
     { 
      with.HttpRequest(); 
      with.JsonBody(envelope); 
     }); 

     A.CallTo(() => fakeCommand.Send(rCommand,envelope.MetaData)).MustHaveHappened(); 

но A.CallTo(() => fakeCommand.Send(rCommand,envelope.MetaData)).MustHaveHappened(); это имеет какой-то ошибки в значении rcommand

+0

Вы должны написать тест перед тем, как написать функцию. Если у вас возникли проблемы с написанием теста, вы должны задать вопрос, действительно ли вы понимаете требования к реализации. Начните с вашей команды .Send() и спросите себя, что вы думаете, должно произойти. Это приведет к тому, что вы напишете единичный тест. Трудно, чтобы читатели SO предлагали единичный тест, потому что мы не знаем, что вы ожидаете. –

+0

благодарит за ваш комментарий – user3044294

ответ

1

Это звучит, как вы хотите явно проверить, что ICommandBus.Send вызывается, когда ваш код выполняется ,

Один подход заключается в том, чтобы издеваться над зависимостью ICommandBus. То есть вставьте объект-макет, реализующий ICommandBus, который может определить, вызван ли этот метод с правильными значениями параметров.

Если вы придерживаетесь такого подхода, вы обычно делаете это с использованием насмешливого фреймворка (например, Moq или RhinoMocks).

Чтобы объяснить, как вы будете использовать макет для этого вкратце, я покажу, как вы можете это сделать, явно реализуя объект-макет объекта самостоятельно, который записывает вызовы методов и затем тестирует их.

E.g.

MockCommandBus : ICommandBus 
{ 
    ICommand PassedCommand { get; set; } 
    MetaData PassedMetaData { get; set; } 

    public void Send(ICommand command, MetaData metaData) 
    { 
     this.PassedCommand = command; 
     this.PassedMetaData = metaData; 
    }  
} 

Тогда ваш тест будет выглядеть следующим образом:

[TestCase] 
public void PostSendsCommandOnBus() 
{ 
    // ARRANGE 
    var mockCommandBus = new MockCommandBus(); 

    ICommand expectedCommand = <whatever you expect>; 
    MetaData expectedMetaData = <whatever you expect>; 

    // Code to construct your CommandModule with mockCommandBus. 

    // ACT 
    // Code to invoke the method being tested. 

    // ASSERT 
    Assert.AreEqual(expectedCommand, mockCommandBus.PassedCommand); 
    Assert.AreEqual(expectedMetaData , mockCommandBus.PassedMetaData); 

} 

Оговорка:

Обратите внимание, что это только один подход к модульному тестированию, что происходит, чтобы соответствовать именно то, что вы просите здесь. Чрезмерное использование макетов для проверки явного взаимодействия с зависимостями на низком уровне может привести к разработке очень хрупких наборов тестов, которые тестируют базовую реализацию, а не поведение системы.

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