3

いくつかの単体テストを実行するためにセッション変数を設定しようとして失敗しました。セッション変数を設定しようとすると、「System.NullReferenceException:オブジェクト参照がオブジェクトのインスタンスに設定されていません」というエラーが表示され続けます。

これが私が構築しているテストです:

[TestMethod]
public void MyMethod()
{
  //Arrange
  int id = 12345;
  string action = "A";
  string comment = "";
  string user = "user";
  var controller = new MyController();

  //Act
  controller.Session["altUser"] = user;
  var result = controller.Process(id, action, comment);

  //Assert
  Assert.IsNotNull(result);     
}

そして、これが私のコントローラーです:

[Authorize]
public class MyController : Controller
{
  public ActionResult Process(int id, string action, string comment)
  {
    string userId = Session["altUser"].ToString();
    //some other stuff that evaluates ID, Action, and Comment
  }
}

ただし、アプリケーション自体を実行すると、エラーは発生せず、アプリケーションは正常に機能します。私は、テスト駆動開発では、テストが実装への道を開くはずであることを理解しています。すでに実行されているアプリケーションの単体テストを練習しようとしています。可能であれば、アプリケーションは機能するので、実装に変更を加えることは避け、ユニットテストを作成して、すでに知っていることをサポートしたいと思います。

4

3 に答える 3

8

コントローラは、HttpContextユニットテストに存在しないからセッションを取得します。これが失敗する理由です。

ただし、モックを作成してHttpContext、そこにモックセッションを配置することもできます。

このようなものが機能する可能性があります(モックフレームワークとしてmoqを使用します)

    var mockControllerContext = new Mock<ControllerContext>();
    var mockSession = new Mock<HttpSessionStateBase>();
    mockSession.SetupGet(s => s["altUser"]).Returns("user");
    mockControllerContext.Setup(p => p.HttpContext.Session).Returns(mockSession.Object);

    var controller = new MyController();
    controller.ControllerContext = mockControllerContext.Object;

明らかに、モックオブジェクトに実際に取得したいものの詳細を入力する必要があります。

また、実際のセッションの代わりに、から独自のクラスを派生させて使用することもできますHttpSessionStateBaseHttpContextBase

于 2013-03-11T21:57:50.873 に答える
2

スプーン、えー、セッションはありません—単体テストを実行すると、ASP.NETruntineは初期化も実行もされません。コード外の依存関係を分解Sessionし、単体テストに必要なクラスとメソッドをASP.NETのランタイム機能から独立させる必要があります。

于 2013-03-11T21:57:05.620 に答える
0

単体テストを実行する場合、Webサーバーを介してプログラムを実行していないため、HttpContextまたはASP.NETセッションにアクセスできませんが、VSでデバッグを介してプログラムを実行する場合は、プログラムがセッションを使用できるようにするVisualStudioWebサーバーが組み込まれています。

これは、 ASP.NETセッションとその仕組みについて説明した記事です。

于 2013-03-11T21:57:03.213 に答える