NMock2.Internal.ExpectationException: о непредвиденных вызовах не сообщается из-за обработки исключений вызывающего кода
Я столкнулся с проблемой при запуске метода тестового примера NUnit для поточно-безопасной длительной операции.
На самом деле, моя длительная операция блокировала остановку служб, поэтому я создал новое свойство интерфейса, названное в
IMembershipPopulator.cs
для использования этого же экземпляра в работе соответствующего метода, и после его реализации я могу выполнить свое требование.
Но когда я пытаюсь запустить модульный тест для этой длительной операции, он выдает исключение ниже:
NMock2.Internal.ExpectationException: о непредвиденных вызовах не сообщается из-за обработки исключений вызывающего кода: неожиданный вызов membersPopulator.CancellationToken = <System.Threading.CancellationToken> Ожидается:
Тестовый класс:
private CancellationTokenSource _mockCancellationTokenSource;
[SetUp]
public void SetUp()
{
Thread.CurrentPrincipal = new GenericPrincipal(new GenericIdentity(Environment.UserName), new string[0]);
_temporaryDirectory = Path.Combine(Path.GetTempPath(), GetType().Name + "_" + DateTime.UtcNow.Ticks);
Directory.CreateDirectory(_temporaryDirectory);
_mocks = new Mockery();
_mockMembershipManager = _mocks.NewMock<IHitecMembershipManager>();
_mockMembershipPopulatorFactory = _mocks.NewMock<IMembershipPopulatorFactory>();
_mockCancellationTokenSource = new CancellationTokenSource();
}
[Test]
public void CsvOnly()
{
using (_mocks.Ordered)
{
var csvDataGatherer = _mocks.NewMock<IDataGatherer>();
Expect.Once.On(_mockMembershipPopulatorFactory)
.Method(nameof(IMembershipPopulatorFactory.CreateCsvDataGatherer))
.With(_settings.Csv)
.Will(Return.Value(csvDataGatherer));
var populator = _mocks.NewMock<IMembershipPopulator>();
Expect.Once.On(_mockMembershipPopulatorFactory)
.Method(nameof(IMembershipPopulatorFactory.CreatePopulator))
.With(NMock2.Is.TypeOf(typeof(IDataGatherer[])) &
NMock2.Has.Property(nameof(Array.Length), NMock2.Is.EqualTo(1)) &
NMockMatchers.ElementAt(0, NMock2.Is.Same(csvDataGatherer)))
.Will(Return.Value(populator));
// the populator will be run
Expect.Once.On(populator)
.Method(nameof(IMembershipPopulator.PopulateMembership));
// the populator will be disposed
Expect.Once.On(populator)
.Method(nameof(IDisposable.Dispose));
// the property cache will be disposed
Expect.Once.On(propertyCache)
.Method(nameof(IDisposable.Dispose));
_synchronizer.Synchronize(_mockCancellationTokenSource);
}
Я создал новое свойство под названием
CancellationToken
в
IMemberShipPopulator.cs
ниже :
Интерфейс:
public interface IMembershipPopulator : IDisposable
{
CancellationToken CancellationToken { get; set; }
IDataStorer[] DataStorers { get; }
void PopulateMembership();
}
Вот фактическая реализация метода вызова из модульного теста:
Класс1:
internal sealed class MembershipSynchronizer
{
/// <summary>
/// Performs a single run of the synchronization service.
/// </summary>
public void Synchronize(CancellationTokenSource cts = default(CancellationTokenSource))
{
Thread.CurrentPrincipal = new DataStorePrincipal("Test_UserName", AuthenticationMethod.PreAuthenticated);
try
{
var populator = _membershipPopulatorFactory.CreatePopulator();
populator.CancellationToken = cts.Token;
populator.PopulateMembership(); // Time consuming operation.
}
catch (Exception e)
{
LoggingUtility.LogTrace(LoggingCategory.Membership, e);
}
}
Вот фактическая реализация длительной операции:
Класс 2:
/// <summary>
/// The main implementation of the membership populator.
/// </summary>
public sealed class Populator : IDisposable, IMembershipPopulator
{
public void PopulateMembership()
{
// Code for time consuming operations.
// ........................................
// ........................................
// ........................................
}
}
Итак, здесь, в тестовом методе, когда
_synchronizer.Synchronize(_mockCancellationTokenSource)
вызывается тогда в Class2, когда включается отладчик
populator.CancellationToken = cts.Token
, на этот раз он выбрасывает исключение выше.
Пожалуйста, подскажите, как добиться этого с помощью имитации и что добавить в метод тестирования, чтобы он работал с последними изменениями в интерфейсе.