1

mvc アプリでルートをテストしています。次のコードがあります。

using System.Web.Routing;
using MvcContrib.TestHelper;
using NUnit.Framework;
using web;
using web.Controllers;

namespace tests.web.Routes
{
    [TestFixture]
    public class routeTests
    {
        [Test]
        public void Route_POSURL_MapsToPOSIndex()
        {
            MvcApplication.RegisterRoutes(RouteTable.Routes);
            "~/POS".ShouldMapTo<POSController>(x => x.Index());
        }

        [Test]
        public void Route_POSGetItem_MapsToPOSGetItem()
        {
            MvcApplication.RegisterRoutes(RouteTable.Routes);
            "~/POS/GetItem/12345".ShouldMapTo<POSController>(x => x.GetItem());
        }
    }
}

ただし、2 番目のテストは次のように失敗します。ルート名は一意である必要があります。

いずれかのテストを個別に実行すると、正常に実行されます。明らかに、NUnit はテスト全体でルーティング テーブルを共有しています。なんで?

RegisterRoutes 呼び出しを TestFixtureSetup メソッドに入れることができることはわかっていますが、これでは問題が解決されず、何が欠けているのか知りたいです。

何か足りないだけですか?この質問がネット上のどこにも見つからないのはなぜですか?

ありがとう!マット

4

2 に答える 2

1

ルートを共有するのはNUnitではないと思います-それがASP.NET MVCの仕組みだと思います。FWIW、ルートをテストするとき、通常は RegisterRoutes を [TestFixtureSetup] に入れます。おそらく同じことをしても大丈夫でしょう。

于 2009-08-11T06:56:14.633 に答える
0

何が起こっているのかを説明する Martin Fowler の素晴らしい記事を見つけました: http://martinfowler.com/bliki/JunitNewInstance.html

この記事にたどり着いたのは xUnit Test Patterns の本でした。

それは私が Java の専門家だったからなのか、それとも単に思い込みをしただけなのかはわかりません。テストを実行すると、JUnit はすべてのメソッドに対して新しい TestCase オブジェクトを作成します。つまり、グローバル変数でさえ、単一のテスト メソッドごとにリセットされ、共有されません。

これは NUnit には当てはまりません。NUnit は TestCase オブジェクトを 1 つだけ作成するため、すべてのグローバル変数が共有されます。トム、MVC がルートのグローバル変数を作成するという事実は正しいですが、NUnit はこれをダンプせず、他のほとんどの xUnit フレームワークのようにテストごとに新しい変数を作成します。

TestFixtureSetup メソッドにレジスタ ルート コードを配置しましたが、もちろん動作します。今何が起こっているのかを理解できてうれしいです。

于 2009-08-11T16:08:01.617 に答える