0

私は xUnit と Moq をいじり始めていますが、それが正しいかどうか疑問に思っていました。

次のようなテストを書くべきですか:

[Fact]
public void ForWebShouldReturnDev()
{
    // Arrange
    var server = new Mock<HttpServerUtilityBase>();
    server.SetupSequence(s => s.MachineName).Returns("t11466").Returns("localhost").Returns("webdev");

    var context = new Mock<HttpContextBase>();
    context.SetupGet(c => c.Server).Returns(server.Object);

    var service = new EnvironmentService(context.Object, null);

    // Act / Assert
    service.GetApplicationEnvironment().Should().Be(ApplicationEnvironment.Dev);
    service.GetApplicationEnvironment().Should().Be(ApplicationEnvironment.Dev);
    service.GetApplicationEnvironment().Should().Be(ApplicationEnvironment.Dev);
}

または、次のようにします。

[Fact]
public void ForWebShouldReturnDev()
{
    // Arrange
    var server = new Mock<HttpServerUtilityBase>();

    var context = new Mock<HttpContextBase>();
    context.SetupGet(c => c.Server).Returns(server.Object);

    var service = new EnvironmentService(context.Object, null);

    // Act / Assert
    foreach (var name in new string[] { "t11466", "localhost", "webdev" })
    {
        server.Setup(s => s.MachineName).Returns(name);
        service.GetApplicationEnvironment().Should().Be(ApplicationEnvironment.Dev);
    }
}

テストごとに 1 つのコード単位のみをテストすることになっていることはわかっていますが、テストに変数がある場合、アサートをループしても問題ありませんか?

これらの種類のものをテストするための最良の方法を見つけるのに苦労しています.

記録のために、以下はテスト中の実際のコードです。

// The constructor for the application environment
public EnvironmentService(HttpContextBase httpContext, IEnvironment environment)
{
    this.environment = environment;
    this.httpContext = httpContext;
}

private readonly Dictionary<ApplicationEnvironment, string> applicationEnvironments = new Dictionary<ApplicationEnvironment, string>() {
    { ApplicationEnvironment.Dev, "DEV" },
    { ApplicationEnvironment.Test, "TEST" },
    { ApplicationEnvironment.QA, "QA" },
    { ApplicationEnvironment.Prod, "PROD" }
};

public ApplicationEnvironment GetApplicationEnvironment()
{
    var machine = IsWeb ? httpContext.Server.MachineName : environment.GetCommandLineArgs().First();

    return applicationEnvironments.FirstOrDefault(x => machine.ToUpper().Contains(x.Value)).Key;
}

Moq の詳細について、ここで別の質問があります。

Moq に関する適切なリソースはありますか。ドキュメントはかなり薄いものです。

4

1 に答える 1

1

NUnitを使用する場合、私は個人的に[TestCase]属性を使用します。その方法では、まだ1つのことをテストしていますが、テストする一連のケースがあります。

xUnitにも同様の何かが存在し 、このSO投稿のこの投稿で説明されています

于 2012-10-31T11:26:39.817 に答える