Я создал этот тест: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
}
}
Я думаю, что проблема связана с:
Core.Kernel
реализуетCore.IKernel
.Core.IKernel
имеетAddUserIdentity(...)
способ.- Я издевательски
Core.Kernel
вместо издевательствCore.IKernel
. - Согласно
Core.IKernel.AddUserIdentity(...)
метод реализацииAddUser
должен быть достигнут. AddUser
-internal virtual
методCore.Kernel
. Это не реализация какого-либо интерфейса метода.
Я хочу утверждать, что AddUser
вызывается один раз, когда достигнуто AddUserIdentity
.
Другие вопросы насмешливо:
For<T>
где Т представляет собой конкретный класс ->virtual
методы заменяются? novirtual
методы выполнены?ForPartsOf<T>
где T - конкретный класс -> Какие части этого класса издеваются (virtual methods
, методы переопределенного интерфейса)?
Я не могу сказать, из этого кода, почему утверждение не удается, но думал, что я должен упомянуть, вы, кажется, подставляя 'Core.Kernel', но хотите проверить часть логики. Например, вы вызываете 'coreKernel.Initialise()' и 'AddUserIdentity (...) 'на подстановке, которая не будет запускать какую-либо фактическую логику, если она является« виртуальной ». Для достижения этой цели вы можете проверить документацию на [частичные заменители] (http://nsubstitute.github.io/help/partial-subs/). Или еще лучше, реорганизовать дизайн, чтобы вы могли обновить реальное «Ядро.Кернел» и проверить его взаимодействия со своими зависимостями. –
Спасибо, Дэвид за ваши комментарии. Не могли бы вы взглянуть на почту? Я отредактировал его, чтобы добавить некоторые детали. – Jordi