2015-12-03 2 views
2

Я пытаюсь выяснить причину, по которой мой модульный тест завершился неудачей при запуске вместе с другими модульными тестами в решении, но передается при запуске в одиночку. Может ли кто-нибудь показать мне, что мне не хватает?Тестирование метода async не дает согласованного результата

SUT - класс, называемый CompositeClient, который по существу является классом оболочки вокруг двух других клиентов. Основная идея - отдать приоритет одному из тех клиентов, которые будут называться.

public class CompositeClient : IReceiverChannel 
{ 
    private static readonly List<IReceiverChannel> ReceiverChannels = new List<IReceiverChannel>(); 

    public CompositeClient(IReceiverChannel priority, IReceiverChannel normal) 
    { 
     ReceiverChannels.Add(priority); 
     ReceiverChannels.Add(normal); 
    } 

    public async Task<IEnumerable<Request>> ReceiveBatchAsync(int batchSize) 
    { 
     var req = new List<Request>(); 

     foreach (var channel in ReceiverChannels) 
     { 
      req.AddRange(await channel.ReceiveBatchAsync(batchSize - req.Count).ConfigureAwait(false)); 

      if (req.Count >= batchSize) 
      { 
       break; 
      } 
     } 

     return req; 
    } 
} 

Выполнение единичного теста ниже со всеми другими модульными испытаниями в решении дает мне неудачный результат. Но если я проведу этот тест один, он пройдет.

[TestMethod] 
public async Task ReceivedRequestShouldComeFromPriorityClientFirst() 
{ 
    var normalPriorityClient = GetNormalClientMock(); 
    var highPriorityClient = GetPriorityClientMock(); 
    var compositeClient = new CompositeClient(highPriorityClient, normalPriorityClient); 

    var requests = await compositeClient.ReceiveBatchAsync(1); 

    requests.Should().HaveCount(1); 
    requests.First().Origin.Should().BeSameAs("priority"); 

    normalPriorityClient.CallCount.Should().Be(1); // It will fail here with actual CallCount = 0. 
    highPriorityClient.CallCount.Should().Be(0); 
} 

private static ReceiverChannelMock GetNormalClientMock() 
{ 
    return new ReceiverChannelMock("normal"); 
} 

private static ReceiverChannelMock GetPriorityClientMock() 
{ 
    return new ReceiverChannelMock("priority"); 
} 

private class ReceiverChannelMock : IReceiverChannel 
{ 
    private readonly string name; 

    public ReceiverChannelMock(string name) 
    { 
     this.name = name; 
    } 

    public int CallCount { get; private set; } 

    public Task<IEnumerable<Request>> ReceiveBatchAsync(int batchSize) 
    { 
     this.CallCount++; 
     return Task.FromResult<IEnumerable<Request>>(
      new List<Request> 
          { 
           new Request 
            { 
             Origin = this.name 
            } 
          }); 
    } 
} 

Инструменты, используемые:

  • Visual Studio 2013
  • .NET Framework 4.5.2
  • Resharper 9,2
  • FluentAssertion
+3

Класс имеет свойство 'static'. Другие тесты, модифицирующие это свойство? Элементы 'static' являются классно плохими для модульных тестов. – David

+0

Привет - на какое статическое свойство вы ссылаетесь? –

+0

'ReceiverChannels' - тот, у которого есть ключевое слово static. – David

ответ

1

Как Дэвид отметил, я проглядел статическое поле, которое я объявил в классе CompositeClient. Удаление ключевого слова static решало проблему.

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