2015-09-15 2 views
0

У меня есть вопрос, где я хотел бы полностью обменять Moq на NSubstitute. В большинстве случаев это очень просто, однако я столкнулся с довольно сложной проблемой.NSubstitute - настройка свойства вызывающего объекта

Вот код Moq.

_registrationCommandHandler.Setup(c => c.Execute 
(It.Is<CheckUniqueUserCommand>(r => r.Request.UserName == "fred"))). 
       Callback((CheckUniqueUserCommand c) => 
       { 
        c.Response = new CheckUserNameIsUniqueResponse() 
        { 
         IsUnique = true, 
         Success = true 
        }; 
        c.Success = true; 
       }); 

Ближайший я, кажется, чтобы быть в состоянии получить с NSubstitute является

_registrationCommandHandler.When(c => c.Execute  
(Arg.Any<CheckUniqueUserCommand>())).Do 
      ((CheckUniqueUserCommand c) => 
      { 
       c.Response = new __Internal.CheckUserNameIsUniqueResponse() 
       { 
        IsUnique = true, 
        Success = true 
       }; 
      c.Success = true; 
      }); 

, который не будет даже скомпилировать. Это оставляет меня немного застрявшим. У кого-нибудь есть предложения?

ответ

2

Я предполагаю, немного здесь, но попробовать:

_registrationCommandHandler 
    .When(c => c.Execute(Arg.Is<CheckUniqueUserCommand>(r => r.Request.UserName == "fred"))) 
    .Do(call => { 
      var c = call.Arg<CheckUniqueUserCommand>(); 
      c.Response = new __Internal.CheckUserNameIsUniqueResponse() 
      { 
       IsUnique = true, 
       Success = true 
      }; 
      c.Success = true; 
    }); 

NSubstitute не делает тот же аргумент, проходящий в Moq does for callbacks. Вместо этого он передает параметр с информацией о вызове, и вы можете access the arguments using call.Arg<T> or call[i].

В дополнение к изменению блока .Do, я также переключился с Arg.Any(..) на Arg.Is(..), чтобы ближе совместить образец Moq.

Надеюсь, это поможет.

+0

Это, безусловно, делает - еще раз спасибо, Дэвид! –

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