2

人々がコントローラーのテストをどのように編成するかについて、きちんとした提案を探しています。

たとえば、「アドレス」コントローラーの「追加」機能を例にとると、

[AcceptVerbs(HttpVerbs.Get)]
public ActionResult Add()
{
    var editAddress = new DTOEditAddress();
    editAddress.Address = new Address();
    editAddress.Countries = countryService.GetCountries();

    return View("Add", editAddress);
}

[RequireRole(Role = Role.Write)]
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Add(FormCollection form)
{
    // save code here
}

というフィクスチャがあるかもしれませんが、"when_adding_an_address"このタイトルの下でテストする必要があるアクションが 2 つあります...

フィクスチャのメソッドで両方のアクションを呼び出したくないAct()ので、フィクスチャを半分に分割しましたが、どのように名前を付ければよいでしょうか?

"When_adding_an_address_GET"そして"When_adding_an_address_POST"

物事は急速に乱雑になっているようです。

また、コントローラーのステートレス/セットアップレス アサーションをどのように処理し、これらを上記のようにどのように配置しますか? 例えば:

[Test]
public void the_requesting_user_must_have_write_permissions_to_POST()
{
    Assert.IsTrue(this.SubjectUnderTest.ActionIsProtectedByRole(c => c.Add(null), Role.Write));
}

これは私が知っているカスタム コードですが、アイデアを得る必要があります。メソッドにフィルター属性が存在することを確認するだけです。Arrange()ポイントは、またはを必要としないことAct()です。

どんなヒントでも大歓迎です!

ありがとう

4

2 に答える 2

1

私の意見では、テストしているメソッドにちなんでテストに名前を付けることを忘れるべきです。実際、単一のメソッドをテストするというのは奇妙な概念です。クライアントがコードで行う単一のことをテストする必要があります。たとえば、POST と GET で追加をヒットできる場合は、提案したように 2 つのテストを作成する必要があります。特定の例外的なケースで何が起こるかを見たい場合は、別のテストを作成する必要があります。

私は通常、メンテナーが Java で何を知る必要があるかを伝える名前を選びます。

@Test public void shouldRedirectToGetWhenPostingToAdd(){
    //...
}

これは任意の言語で実行でき、必要に応じて任意の *DD 命名規則を選択できますが、ポイントは、テスト名が期待とシナリオを伝える必要があるということです。このようにして非常に小さなテストを取得できます。これは良いことだと思います。

于 2010-06-12T08:17:30.870 に答える
0

さて、13か月後、答えはありません。素晴らしい。

私が今していることは次のとおりです。

/tests/controllers/address/add/get.cs
/tests/controllers/address/add/valid.cs
/tests/controllers/address/add/invalid.cs
于 2010-05-27T08:59:12.203 に答える