1

SupplierControllerクラスとそのクラスを使用しSupplierControllerTestて、期待を検証します。

SupplierControllerクラスが System.Web.Mvc.Controller から継承されている場合、テストは正常に実行されます。SupplierControllerクラスが継承している場合ServiceStack.Mvc.ServiceStackController、テストは例外をスローします。Moqを使用してテストしています。

両方のクラスを次に示します。

テストクラス

  [TestFixture]
  public class SupplierControllerTests
  {
     [Test]
     public void Should_call_create_view_on_view_action()
     {
        var nafCodeServiceMock = new Mock<INafCodeService>();
        var countryServiceMock = new Mock<ICountryService>();
        var controller = new SupplierController();
        controller.NafCodeService = nafCodeServiceMock.Object;
        controller.CountryService = countryServiceMock.Object;

        nafCodeServiceMock.Setup(p => p.GetAll()).Returns(new List<NafCode> { new NafCode { Code = "8853Z", Description = "naf code test" } });
        countryServiceMock.Setup(p => p.GetAll()).Returns(new List<Country> { new Country { Name="France"  } });

        var result = controller.Create() as ViewResult;
        Assert.That(result, Is.Not.Null);
    }
 }

コントローラ クラス

  public class SupplierController : ServiceStackController
  {
     public ISupplierService SupplierService { get; set; }
     public IManagerService ManagerService { get; set; }
     public INafCodeService NafCodeService { get; set; }
     public ICountryService CountryService { get; set; }

     public ActionResult Create()
     {
       var model = new SupplierModel();
       model.Country = "France";
       return View(model);
     }
   }

SupplierModel クラス

  public class SupplierModel
  {
     public string Country { get; set; }
  }

スローされるエラーは次のとおりです。

テスト 'SupplierControllerTests.Should_call_create_view_on_view_action' が失敗しました: System.MethodAccessException : Échec de latempative d'accès de la method 'SupplierController.Create()' à la method 'System.Web.Mvc.Controller.View(System.Object)'. Controllers\SupplierController.cs(51,0): → SupplierController.Create() Controllers\SupplierControllerTests.cs(33,0): → SupplierControllerTests.Should_call_create_view_on_view_action()

これを翻訳すると、次のようになります。

メソッド 'SupplierController.Create()' へのアクセスに失敗しました。

4

1 に答える 1

1

私はそれにクラックを取ります。使用している MVC のバージョンはわかりませんが、ServiceStack は古いバージョンに対してコンパイルされていると思います。バインド リダイレクトが必要になります。通常、バインド リダイレクトは MVC プロジェクト テンプレートの一部として追加されますが、単体テスト プロジェクトでは手動で行う必要があります (これは、単体テストでのみこのエラーが発生する理由を説明しています)。

単体テスト プロジェクト app.config で (この例では、MVC2 から MVC3 にリダイレクトします。ケースに合わせて調整します):

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <runtime>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
      <dependentAssembly>
        <assemblyIdentity name="System.Web.Mvc" publicKeyToken="31bf3856ad364e35" />
        <bindingRedirect oldVersion="1.0.0.0-2.0.0.0" newVersion="3.0.0.0" />
      </dependentAssembly>
    </assemblyBinding>
  </runtime>
</configuration>
于 2013-09-26T21:20:52.450 に答える