2017-02-14 4 views
-1

Я создал этот тест:NSubstitute: Принятые вызовы утверждает неправильно

[TestFixture] 
public class UsersTests 
{ 
    private Core.Kernel coreKernel; 
    private Core.Configuration.ICoreConfiguration coreConfiguration; 

    [SetUp] 
    public void SetUp() 
    { 
     this.coreConfiguration = NSubstitute.Substitute.For<Core.Configuration.ICoreConfiguration>(); 
     this.coreKernel = NSubstitute.Substitute.For<Core.Kernel>(this.coreConfiguration); 

     this.coreKernel.Initialize(); 
    } 

    [Test] 
    public void AddUserTest() 
    { 
     Core.Communication.Entities.UserIdentity receivedUserIdentity = new Core.Communication.Entities.UserIdentity("user1", "passwd1"); 

     ((Core.Communication.ICoreService)this.coreKernel).AddUserIdentity(receivedUserIdentity); 
     this.coreKernel.Received(100).AddUser(Arg.Is<Core.Identity.UserIdentity>(u => u.UserId.Equals(receivedUserIdentity.UserId))); 
    } 
} 

Core.Kernel, где находится:

public partial class Kernel : Core.IKernel 
{ 
    public Kernel(Configuration.ICoreConfiguration configuration) 
      : this(configuration, null, Enumerable.Empty<Type>()) 
    { 

    } 

    public Kernel(Configuration.ICoreConfiguration configuration, Communication.ICoreService service, IEnumerable<Type> producerTypes) 
    { 
     if (configuration == null) 
      throw new ArgumentException("configuration object must be provided", "configuration"); 

     if (producerTypes.Any(t => !t.IsAssignableFrom(typeof(Core.Extensibility.AbstractProducerPlugin)))) 
      throw new ArgumentException("All types must inherit from AbstractProducerPlugin", "plugins"); 


     this.state = KernelState.initializing; 

     this.configuration = configuration; 
     this.service = service ?? this; 
     this.producerTypes = producerTypes; 

     this.backends = new Dictionary<Core.Identity.DomainIdentity, Backend.Infrastructure.IBackend>(); 
    } 

    internal virtual void AddUser(Core.Identity.UserIdentity userIdentity) {...} 
} 

Тем не менее, this.coreKernel.Received(100).AddUser(... не вызывается 100 раз, только один. Что я делаю не так?

Я имею в виду, я не пытаюсь сделать 100 звонков до AddUser. Я проверяю, AddUser следует называть 100 раз. Таким образом, утверждение должно потерпеть неудачу.

EDIT

Guess этот код (Core.IKernel.AddUserIdentity(...) реализация):

public class Core.Kernel { 
    public override void Core.IKernel.AddUserIdentity(UserIdentity userIdentity) { 
     this.AddUser(userIdentity); <<----- AddUser(...) is called 
    } 
} 

Я думаю, что проблема связана с:

  1. Core.Kernel реализует Core.IKernel. Core.IKernel имеет AddUserIdentity(...) способ.
  2. Я издевательски Core.Kernel вместо издевательств Core.IKernel.
  3. Согласно Core.IKernel.AddUserIdentity(...) метод реализации AddUser должен быть достигнут.
  4. AddUser - internal virtual метод Core.Kernel. Это не реализация какого-либо интерфейса метода.

Я хочу утверждать, что AddUser вызывается один раз, когда достигнуто AddUserIdentity.

Другие вопросы насмешливо:

  1. For<T> где Т представляет собой конкретный класс ->virtual методы заменяются? no virtual методы выполнены?
  2. ForPartsOf<T> где T - конкретный класс -> Какие части этого класса издеваются (virtual methods, методы переопределенного интерфейса)?
+0

Я не могу сказать, из этого кода, почему утверждение не удается, но думал, что я должен упомянуть, вы, кажется, подставляя 'Core.Kernel', но хотите проверить часть логики. Например, вы вызываете 'coreKernel.Initialise()' и 'AddUserIdentity (...) 'на подстановке, которая не будет запускать какую-либо фактическую логику, если она является« виртуальной ». Для достижения этой цели вы можете проверить документацию на [частичные заменители] (http://nsubstitute.github.io/help/partial-subs/). Или еще лучше, реорганизовать дизайн, чтобы вы могли обновить реальное «Ядро.Кернел» и проверить его взаимодействия со своими зависимостями. –

+0

Спасибо, Дэвид за ваши комментарии. Не могли бы вы взглянуть на почту? Я отредактировал его, чтобы добавить некоторые детали. – Jordi

ответ

0

Он вызывается только один раз, потому что вы звоните только AddUser. В Received утверждение проверяет, сколько раз она была вызвана, она не говорит NSubstitue назвать ваш метод в 100 раз, что вам нужно сделать это вручную :)

NSubstitute также дает возможность утверждать определенное количество вызовов были получены путем передачи целого числа в Received(). Это будет бросать, если заменить не получает точно, что многие совпадения называет

http://nsubstitute.github.io/help/received-calls/

+0

Спасибо user9993 за ваш комментарий. Я понимаю, что делает код, тем не менее, утверждение должно потерпеть неудачу, тем не менее это успех. 'AddUser' следует вызывать один раз после выполнения' AddUserIdentity'. – Jordi

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