3

Postが宣言されている単純なNancyModuleがあります。

Post["/Car/New"] = args => 
{
    Car newCar = this.Bind<Car>();
    newCar = _carRepos.CreateNewCar(newCar);
    return Response.AsJson<Car>(newCar);
};

ビューからこれに投稿すると正常に機能します。

<form action="/Car/New" method="post">
    <input type="text" name="colour" />
    <input type="submit" value="Submit" />
</form>

このルートのテストを実行しようとすると、次のエラーが発生します。

System.Exception : ConfigurableBootstrapper Exception
  ----> Nancy.RequestExecutionException : Oh noes!
  ----> System.MissingMethodException : Method not found: '!!0 Nancy.ModelBinding.ModuleExtensions.Bind(Nancy.INancyModule, System.String[])'.
Result StackTrace:  
at Nancy.Testing.PassThroughStatusCodeHandler.Handle(HttpStatusCode statusCode, NancyContext context)
at Nancy.NancyEngine.CheckStatusCodeHandler(NancyContext context)
at Nancy.NancyEngine.HandleRequest(Request request, Func`2 preRequest)
at Nancy.NancyEngine.HandleRequest(Request request)
at Nancy.Testing.Browser.HandleRequest(String method, String path, Action`1 browserContext)
at Nancy.Testing.Browser.Post(String path, Action`1 browserContext)
at Shopr.Tests.Cars.CarTests.PostNewCarReturnsCar() in c:\Users\*******\Documents\Visual Studio 2012\Projects\Shopr\Shopr.Tests\Cars\CarTests.cs:line 35
--RequestExecutionException
at Nancy.NancyEngine.InvokeOnErrorHook(NancyContext context, ErrorPipeline pipeline, Exception ex)
--MissingMethodException
at Shopr.Api.Modules.CarsModule.<.ctor>b__3(Object args)
at Nancy.Routing.Route.Invoke(DynamicDictionary parameters)
at Nancy.Routing.DefaultRouteInvoker.Invoke(Route route, DynamicDictionary parameters, NancyContext context)
at Nancy.Routing.DefaultRequestDispatcher.Dispatch(NancyContext context)
at Nancy.NancyEngine.InvokeRequestLifeCycle(NancyContext context, IPipelines pipelines)

そしてこれが私のテストです:

[Test]
public void PostNewCarReturnsCar()
{
    var browser = BrowserFactory.Create();
    var response = browser.Post("/Car/New", with =>
    {
        with.FormValue("Colour", "Red");
    });

    var car = GetObjectFromJsonBody(response.Body.AsString());

    Assert.IsNotNull(car);
    Assert.AreEqual(2, car.Id);
}

これは私のテスト用Bootstrapperです:

public class NancyBootstrapper : ConfigurableBootstrapper
{
    public NancyBootstrapper()
        : base(with => { with.Module<CarsModule>(); })
    { }

    protected override void ConfigureApplicationContainer(TinyIoCContainer container)
    {
        container.Register<ICarRepository>(new FakeData.CarRepository());
    }
}

バインディングを機能させるには、ConfigurableBootstrapperで特別なことをする必要がありますか?

4

2 に答える 2

6

packages.config が正しいバージョンをプルしていることを再確認してください。

更新:これは主に @StevenRobbins からのものなので、彼の背中を軽くたたきます:

ここに画像の説明を入力

于 2013-03-11T15:44:03.740 に答える
2

packages.config をチェックするという @Jon の提案は正しかった。パッケージは同じ方法を使用して互いに数分以内に追加されましたが、テスト プロジェクトには Web プロジェクトよりも古いバージョンの Nancy が含まれていました。適切なバージョンに更新され、正常に動作するようになりました。

于 2013-03-11T15:42:32.373 に答える