(Эта статья изначально опубликована в моем блоге)

Поработав некоторое время с C# при написании настольных приложений, я начал переходить на стандарт .NET. По моему профессиональному опыту, переход был намного медленнее из-за требований к продукту и времени, но в моем личном развитии нет причин, по которым я не мог бы начать с него. И называйте меня сумасшедшим, но мне нравится писать закодированные тесты для вещей, которые я делаю. Моя любимая среда тестирования для моей разработки на C# — это xUnit, и, естественно, когда я начал писать новый код с .NET Standard, я хотел убедиться, что мои тесты запустятся.

xUnit-тесты — пример

Вот пример кода на C#, который я написал для своих модульных тестов простого класса кэша LRU, с которым я играл:

[ExcludeFromCodeCoverage]
    public sealed class LruCachetests
    {
        [Fact]
        public void Constructor_CapacityTooSmall_ThrowsArgumentException()
        {
            Assert.Throws<ArgumentException>(() => new LruCache<int, int>(0));
        }

        [Fact]
        public void ContainsKey_EntryExists_True()
        {
            var cache = new LruCache<int, int>(1);
            cache.Add(0, 1);
            var actual = cache.ContainsKey(0);
            Assert.True(
                actual,
                $"Unexpected result for '{nameof(LruCache<int, int>.ContainsKey)}'.");
        }
    }

Довольно простые вещи. Я знаю, что для xUnit в Visual Studio мне нужно получить пакет nuget, чтобы программа запуска тестов работала прямо в IDE. Достаточно просто, мне просто нужно добавить пакет «xunit.runner.visualstudio» вместе с пакетом xunit, который я уже включил в свой тестовый проект.

Готов зажечь! Итак, я запускаю все свои тесты в решении, но меня встречает небольшой сюрприз:

[3/24/2020 3:59:10.570 PM] ========== Discovery aborted: 0 tests found (0:00:00.0622045) ==========
[3/24/2020 3:59:20.510 PM] ---------- Discovery started ----------
Microsoft.VisualStudio.TestPlatform.ObjectModel.TestPlatformException: Unable to find C:[redacted]binDebugnetstandard2.0testhost.dll. Please publish your test project and retry.
   at Microsoft.VisualStudio.TestPlatform.CrossPlatEngine.Hosting.DotnetTestHostManager.GetTestHostPath(String runtimeConfigDevPath, String depsFilePath, String sourceDirectory)
   at Microsoft.VisualStudio.TestPlatform.CrossPlatEngine.Hosting.DotnetTestHostManager.GetTestHostProcessStartInfo(IEnumerable`1 sources, IDictionary`2 environmentVariables, TestRunnerConnectionInfo connectionInfo)
   at Microsoft.VisualStudio.TestPlatform.CrossPlatEngine.Client.ProxyOperationManager.SetupChannel(IEnumerable`1 sources, String runSettings)
   at Microsoft.VisualStudio.TestPlatform.CrossPlatEngine.Client.ProxyDiscoveryManager.DiscoverTests(DiscoveryCriteria discoveryCriteria, ITestDiscoveryEventsHandler2 eventHandler)
[3/24/2020 3:59:20.570 PM] ========== Discovery aborted: 0 tests found (0:00:00.0600179) ==========
Executing all tests in project: [redacted].Tests
[3/24/2020 3:59:20.635 PM] ---------- Run started ----------
[3/24/2020 3:59:20.639 PM] ========== Run finished: 0 tests run (0:00:00.0039314) ==========

Опубликуйте свой тестовый проект и повторите попытку? Хм?

Как и любой инженер-программист, я отправился в Google за ответами. Я наткнулся на это сообщение о переполнении стека: https://stackoverflow.com/q/54770830/2704424

Решение моих проблем с xUnit

И, к счастью, кто-то ответил ссылкой на документацию xUnit: Почему xUnit.net не поддерживает netstandard?

Ответ был прямо наверху!

netstandard — это API, а не платформа. Из-за того, как сегодня работают сборки и разрешение зависимостей, тестовые проекты xUnit.net должны быть нацелены на платформу (настольная среда CLR, .NET Core и т. д.) и выполняться с приложением запуска для конкретной платформы.

https://xunit.net/docs/why-no-netstandard

Мое решение заключалось в том, что я изменил свой тестовый проект на сборку для одной из последних платформ .NET Framework… и вуаля! Я выбрал .NET 4.8 как последнюю доступную на момент написания.

Моя следующая попытка запустить все мои тесты выглядела так:

Executing all tests in project: [Redacted].Tests
[3/24/2020 3:59:20.635 PM] ---------- Run started ----------
[3/24/2020 3:59:20.639 PM] ========== Run finished: 0 tests run (0:00:00.0039314) ==========
[3/24/2020 4:08:14.898 PM] ---------- Discovery started ----------
[xUnit.net 00:00:00.00] xUnit.net VSTest Adapter v2.4.1 (32-bit Desktop .NET 4.0.30319.42000)
[xUnit.net 00:00:00.40]   Discovering: [Redacted].Tests
[xUnit.net 00:00:00.47]   Discovered:  [Redacted].Tests
[xUnit.net 00:00:00.00] xUnit.net VSTest Adapter v2.4.1 (32-bit Universal Windows)
[3/24/2020 4:08:16.289 PM] ========== Discovery finished: 2 tests found (0:00:01.3819229) ==========
Executing all tests in project: [Redacted].Tests
[3/24/2020 4:08:17.833 PM] ---------- Run started ----------
[xUnit.net 00:00:00.00] xUnit.net VSTest Adapter v2.4.1 (32-bit Desktop .NET 4.0.30319.42000)
[xUnit.net 00:00:00.41]   Starting:    [Redacted].Tests
[xUnit.net 00:00:00.66]   Finished:    [Redacted].Tests
[3/24/2020 4:08:19.337 PM] ========== Run finished: 2 tests run (0:00:01.4923808) ==========

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

(Эта статья изначально опубликована в моем блоге)