Nunit: TestContext.Current.TestDirectory gibt einen falschen Wert zurück

Erstellt am 30. Jan. 2019  ·  4Kommentare  ·  Quelle: nunit/nunit

In .NET - Core, wenn sie in einem [TestCaseSource] Eigentum, TestContext.Current.TestDirectory gibt einen falschen Wert.

Der zurückzugebende Wert ist der Pfad zu dem Verzeichnis, das die getestete Assembly enthält.

Der Wert ist der Pfad zu dem Verzeichnis, das nunit.framework.dll im lokalen NuGet-Cache des Benutzers enthält.

Gegeben die folgende Testklasse:

using System;
using System.Collections.Generic;
using System.IO;
using NUnit.Framework;

namespace Tests
{
    public class Tests
    {
        [TestCaseSource(nameof(TestDirectorySource))]
        public void Test1(string testDirectory)
        {
            var assemblyDirectory = Path.GetDirectoryName(new Uri(GetType().Assembly.CodeBase).LocalPath);

            Assert.That(testDirectory, Is.EqualTo(assemblyDirectory));
        }

        public static IEnumerable<string> TestDirectorySource
        {
            get
            {
                yield return TestContext.CurrentContext.TestDirectory;
            }
        }
    }
}

Beim Targeting von .NET 4.7.2 ( net472 ) ist der Test erfolgreich.

Beim Targeting von .NET Core 2.1 ( netcoreapp2.1 ) schlägt der Test fehl.

(Da es sich um ein TestCaseSource , haben die Tests auch unterschiedliche Namen auf verschiedenen Plattformen.)

Ausgabe von dotnet test für ein Multi-Targeting-Projekt:

C:\Temp\NUnitDirectory>dotnet test
Build started, please wait...
Build completed.

Test run for C:\Temp\NUnitDirectory\bin\Debug\net472\NUnitDirectory.dll(.NETFramework,Version=v4.7.2)
Microsoft (R) Test Execution Command Line Tool Version 15.9.0
Copyright (c) Microsoft Corporation.  All rights reserved.

Starting test execution, please wait...

Total tests: 1. Passed: 1. Failed: 0. Skipped: 0.
Test Run Successful.
Test execution time: 1.1367 Seconds
Test run for C:\Temp\NUnitDirectory\bin\Debug\netcoreapp2.1\NUnitDirectory.dll(.NETCoreApp,Version=v2.1)
Microsoft (R) Test Execution Command Line Tool Version 15.9.0
Copyright (c) Microsoft Corporation.  All rights reserved.

Starting test execution, please wait...
Failed   Test1("C:\\Users\\yaakov.smith\\.nuget\\packages\\nunit\\3.10.1\\lib\\netstandard2.0")
Error Message:
   Expected string length 46 but was 69. Strings differ at index 3.
  Expected: "C:\\Temp\\NUnitDirectory\\bin\\Debug\\netcoreapp2.1"
  But was:  "C:\\Users\\yaakov.smith\\.nuget\\packages\\nunit\\3.10.1\\lib\\netsta..."
  ---------------^

Stack Trace:
   at Tests.Tests.Test1(String testDirectory) in C:\Temp\NUnitDirectory\UnitTest1.cs:line 15


Total tests: 1. Passed: 0. Failed: 1. Skipped: 0.
Test Run Failed.
Test execution time: 0.9013 Seconds

C:\Temp\NUnitDirectory>
bug normal

Alle 4 Kommentare

Falls gerade kein Test ausgeführt wird (wie im Ermittlungsschritt) Die TestDirectory-Eigenschaft gibt das Verzeichnis zurück, das die aufrufende Assembly enthält. Dies funktioniert im vollständigen .net-Framework, aber im Fall des .net-Standards existiert die Methode Assembly.GetCallingAssembly() nicht und das Assembly-Verzeichnis des Nunit-Frameworks wird verwendet.
IMO TestDirectory sollte null zurückgeben, falls kein Test ausgeführt wird, aber dies wäre eine grundlegende Änderung.
Normalerweise verlasse ich mich auf typeof(MyTestClass).GetTypeInfo().Assembly , um stabile Ergebnisse zu erhalten.

Wäre dies nicht ein guter Grund, das eval des TestCaseDataSource-Attributs nach der Testfall-Setup-Methode zu verschieben?

@ravensorb Entschuldigung, ich

Entschuldigung, ich habe beim falschen Problem auf Senden geklickt. Ich wollte auf eines der anderen offenen Probleme im Zusammenhang mit der Lastreihenfolge mit Testfalldaten antworten. Ich bin auf viele Probleme in diesem Bereich gestoßen. Verzeihung.

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen