Я использую FluentAssertions 5.3.0 под NCrunch 3.14.0.1. Когда тест не проходит, я часто видел эту ошибку, когда FluentAssertions пытается сгенерировать сообщение отчета ...
System.ArgumentOutOfRangeException: startIndex cannot be larger than length of string. Parameter name: startIndex at System.String.Substring(Int32 startIndex, Int32 length) at FluentAssertions.CallerIdentifier.ExtractVariableNameFrom(StackFrame frame) at FluentAssertions.CallerIdentifier.DetermineCallerIdentity() at FluentAssertions.Execution.AssertionScope.GetIdentifier() at FluentAssertions.Execution.AssertionScope.FailWith(String message, Object[] args) at FluentAssertions.Numeric.NumericAssertions`1.Be(T expected, String because, Object[] becauseArgs) at TableTests.ConsolidatedMovementsTester.AlternativingMovementStatesAreRecognised() in ...test.cs
Ошибка носит спорадический характер - часто она исчезает при повторном запуске теста (в этом случае отображается соответствующий отчет об ошибке). Я видел это в последних двух версиях как FluentAssertions, так и NCrunch, и он появляется на нескольких машинах (на всех работает некоторая разновидность Visual Studio 2017 Professional).
Вот пример последнего призыва меня укусить ...
results.Count(c => c.IsStationary).Should().Be(5);
где полученные результаты - ImmutableArray POCOs
В этом случае щелчок правой кнопкой мыши по провалившемуся тесту и выбор «rerun in new test runner» в окне ncrunch вызвали повторный запуск теста и FA для выдачи правильного отчета.
Может ли кто-нибудь предложить обходной путь для этого?
Я вижу это во множестве звонков - я добавил один к вопросу.
Бьет меня. Если вы проверите код для извлечения имени, я не могу придумать сценарий, в котором начальный индекс может быть больше, чем сама строка.
Я подозреваю, что это своего рода состояние гонки, основанное на том, как Ncrunch постоянно компилирует и запускает тесты в фоновом режиме. Предположительно, StackFrame поврежден (или передан не тот)?
Хм, здесь нет ниточувствительного кода. Но я действительно вижу вероятность того, что первая подстрока может выйти из строя, если стековый фрейм поврежден или динамичен.
Хм, проблема не в том, что GetSourceCodeLineFrom извлекает имя файла из стекового фрейма, а затем уходит, чтобы прочитать это? В сценарии Ncrunch тесты компилируются и запускаются буквально при каждом нажатии клавиши, поэтому нет гарантии, что файл / строка, которую вы читаете, соответствует тому, что упоминается в стеке? (Я не говорю, что это необоснованное предположение - возможно, Ncrunch лучше справится с изоляцией окружающей среды ...)
Вы бы хотели попробовать этот пакет? Если нормально, отпущу. ci.appveyor.com/api/buildjobs/o0trdip6gjk4447r/artifacts/…
Позвольте нам продолжить обсуждение в чате.
Как выглядит призыв к FA (конкретно)?