3

これが私のシナリオです:

私は .NET MVC 4.0 プロジェクトとリポジトリ (ご想像のとおり) を使用して作業しており、Moq/xUnit テスト ライブラリを .NET ユニット テスト プロジェクトに実装しようとしています。

私はこれまでのところ持っています:

MVC コントローラー

private IHOLService _service;

public PolicyController(IHOLService service)
{
      _service = service;
}

public ActionResult Index()
{
     var policies = _service.GetAllPolicies(100, 0).ToList();

     return View(policies);
}

ユニットテストクラス

[Fact]
 public void GetPolicies()
 {
            // Arrange
            var mockService = new Mock<IHOLService>();
            List<Policy> policy = new List<Policy>()
            mockService.Setup(cr => cr.GetAllPolicies(10, 0)).Returns(policy);
            var controller = new PolicyController(mockService.Object);

            // policy here contains 0 results.

             // Act
        var result = (ViewResult)controller.Index();

        var model = result.ViewData.Model; // equals 0.

        // Assert
        var listCategories = Assert.IsAssignableFrom<List<Policy>>(result.ViewData.Model);

         // listCategories.Count equals 0 results.

        Assert.Equal(10, listCategories.Count); // Thus always fails
  }

私の問題は、コントローラーが直接呼び出されると、すべてが正常に機能し、100 個のポリシーが読み込まれることです。

ただし、テストを実行すると、0 個の製品が読み込まれます。これは、サービスの初期化に関係する可能性のある、どこかでモック呼び出しに問題があると推測しています。これまでにこれを経験したことがあり、アドバイスを提供できる人はいますか?

また、データ層に保持されているリポジトリではなく、サービスをテストするのは正しいですか?

前もって感謝します。

4

1 に答える 1

2

テスト コードでは、空のリストに初期化policyしてから、モック サービスにこの空のリストを返すように指示します。テスト ロード ポリシーを作成するには、いくつかのポリシー インスタンスをpolicyリストに追加する必要があります。

次のようなテストを書きます。

[Fact]
public void GetPolicies()
{
   // Arrange
   var mockService = new Mock<IHOLService>();
   Policy expectedPolicy = new Policy(); // substitute for the real way you construct these
   List<Policy> policy = new List<Policy>() { expectedPolicy };
   mockService.Setup(cr => cr.GetAllPolicies(10, 0)).Returns(policy);

   // Act
   var result = (ViewResult)controller.Index();

   var model = result.ViewData.Model; // equals 0.

   // Assert
   var listCategories = Assert.IsAssignableFrom<List<Policy>>(result.ViewData.Model);

   Assert.Equal(expectedPolicy, listCategories.First());        
}

しかし、実際には、単体テストを行おうとしているコードの側面によって異なります。私が見る限り、このテストは、ポリシー オブジェクトが期待どおりに保存されていることを確認するだけです。Policy インスタンス自体に依存する任意のロジックに対して、さらにテストを作成できます。

于 2012-11-19T09:57:20.220 に答える