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, на этот раз он выбрасывает исключение выше.

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

0 ответов

Другие вопросы по тегам