Я пытаюсь выяснить причину, по которой мой модульный тест завершился неудачей при запуске вместе с другими модульными тестами в решении, но передается при запуске в одиночку. Может ли кто-нибудь показать мне, что мне не хватает?Тестирование метода 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
Класс имеет свойство 'static'. Другие тесты, модифицирующие это свойство? Элементы 'static' являются классно плохими для модульных тестов. – David
Привет - на какое статическое свойство вы ссылаетесь? –
'ReceiverChannels' - тот, у которого есть ключевое слово static. – David