Оцените несколько утверждений в модульном тесте - не останавливайтесь на первом неудачном - PullRequest
0 голосов
/ 26 апреля 2020

Можно ли попросить ржавчину оценить все утверждения в одном модульном тесте? Давайте рассмотрим следующий модульный тест.

#[test]
fn it_works() {
    assert_eq!(2 + 2, 5);
    assert_eq!(2 + 2, 4);
    assert_eq!(2 + 2, 6);
}

Я хотел бы видеть, что как первое, так и последнее утверждения терпят неудачу. Прямо сейчас ржавчина паникует на первом и перестает оценивать оставшиеся проверки. Единственное решение, которое я придумал, это использовать panic::catch_unwind:

use std::panic;

#[test]
fn it_works2() {
    panic::catch_unwind(|| {
        assert_eq!(2 + 2, 5);
    });
    assert_eq!(2 + 2, 4);
    assert_eq!(2 + 2, 6);
}

Есть ли более элегантный способ сделать это?

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

1 Ответ

1 голос
/ 26 апреля 2020

Думаю, я бы написал отдельный тест для каждого из них. Потому что обычно вы хотите, чтобы все assert s удерживались, и на самом деле не имеет большого значения, потерпел ли первый или второй сбой - все из них должны удержаться.

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

Чтобы сделать это, вы можете выполнить все соответствующие сравнения одно за другим и, возможно, сохранить кортежи (помня левую и правую стороны) неудачные сравнения в Vec. В конце вы можете assert, что Vec пуст. Если он не пустой, вы показываете различия.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...