Асинхронные тесты NUnit терпят неудачу после слияния

НУнит 2.6.4.

У меня есть проект VS/C#, в котором представлены асинхронные методы. У него есть много таких тестов, которые проходят:

    [Test]
    public async void NullProcThrows_Async()
    {
        var keyList = new KeyList<int>();
        Assert.Throws<ArgumentNullException>(async () => await keyList.LoadAsync((IDBProcedure)null, "ID", CancellationToken.None));
    }

Я объединил это с нашим транком (конфликтов нет), и теперь этот тест не проходит. Я пытаюсь понять разницу.

Когда я отслеживаю код в транке, я вижу два исключения:

Во-первых, я ожидаю ArgumentNullException. Второй

NUnit.Framework.AssertionException saying Expected
<System.ArgumentNullException> But was:  null

Когда я запускаю тест в версии ветки, я вижу только одно исключение, и тест проходит.

Что может отличаться между этими двумя проектами?


person n8wrl    schedule 20.06.2016    source источник
comment
Что вы слили?   -  person SLaks    schedule 20.06.2016
comment
Похоже, вы передаете async void лямбду.   -  person SLaks    schedule 20.06.2016
comment
Вы сравнивали код в вашей ветке с транком, чтобы увидеть, что отличается? Весьма вероятно, что слияние не удалось (в смысле слияния неправильного кода), и diff покажет то, что он заменил неправильно.   -  person ChrisF    schedule 20.06.2016
comment
now this test fails - на вашем сервере CI установлена ​​другая версия NUnit? Семантика NUnit вокруг методов async void менялась более одного раза.   -  person Stephen Cleary    schedule 20.06.2016
comment
В этой ветке добавлено несколько асинхронных версий методов синхронизации в репозиториях. Код туда/от идентичен, насколько я могу судить. В этом случае у LoadAsync есть этот метод: общедоступная асинхронная задача LoadAsync (IDBProcedure p, string keyColumnName, CancellationToken ct)   -  person n8wrl    schedule 20.06.2016
comment
Ну теперь это жутко. Я заставил VS получать последние файлы из TFS, перезаписывая файлы, даже если он думал, что они одинаковы, и теперь тесты проходят.   -  person n8wrl    schedule 20.06.2016


Ответы (1)


Кажется, есть несколько проблем с предоставленным кодом, рассмотрим следующее:

[Test, ExpectedException(typeof(ArgumentNullException)]
public async Task NullProcThrows_Async()
{
    var keyList = new KeyList<int>();
    await keyList.LoadAsync((IDBProcedure)null, "ID", CancellationToken.None);
    Assert.Fail("This should never be executed as we expected the above to throw.");
}

Согласно документации NUnit, вы должны использовать атрибут ExpectedException. вместо Assert.Throws. Поэтому я добавил этот атрибут, а затем удалил Assert.Throws и вместо него добавил Assert.Fail. Кроме того, я сделал возврат метода Task, и это предотвратило ошибку async void. Наконец, такой способ предотвращает ошибку async lambda.

person David Pine    schedule 20.06.2016
comment
Спасибо, Дэвид. Я буду считать это обновлением. Я был в отчаянии, чтобы добиться успешного слияния после нашего релиза на выходных. В ветке все нормально проверялось, а в багажнике - нет. так что некоторые биты, должно быть, были изменены, потому что полная версия get-latest решила проблему. - person n8wrl; 20.06.2016