7

私はasp.net mvcアプリケーションに取り組んでおり、ユニットテストBDDスタイルを書いています。例えば。

GetResource_WhenResourceFileExists_ShouldReturnResources()

しかし、コントローラーのテストを書いているときは、通常、同じ名前の 2 つのメソッドがあります。1 つは get リクエスト用のパラメーターなしで、もう 1 つは投稿用です。この 2 つを区別するための適切な命名規則を持っている人はいますか?

私は考えることができます:

1.
LogIn_WithParameters_ShouldReturnLogInView()
LogIn_WithoutParameters_WhenAuthenticationFailed_ShouldReturnLogInView()
LogIn_WithoutParameters_WhenAuthenticationPassed_ShouldReturnProfileRedirect()

2.
LogIn_Get_ShouldReturnLogInView()
LogIn_Post_WhenAuthenticationFailed_ShouldReturnLogInView()
LogIn_Post_WhenAuthenticationPassed_ShouldReturnProfileRedirect()

3.
LogIn_ShouldReturnLogInView()
LogIn_WhenCalledWithParametersAndAuthenticationFailed_ShouldReturnLogInView()
LogIn_WhenCalledWithParametersAndAuthenticationPassed_ShouldReturnProfileRedirect()

ご意見はありますか?

4

5 に答える 5

3

私は非常にうまく機能する次の形式を使用します。

[TestFixture]    
public class Log_in_with_parameters_should
{
    [Test]
    public void Return_the_log_in_view() {}
}

[TestFixture]    
public class Log_in_without_parameters_should
{
    [Test]
    public void Return_the_log_in_view_when_the_authentication_failed() {}

    [Test]
    public void Redirect_to_the_profile_when_the_authentication_passed() {}
}
于 2009-12-28T23:02:53.377 に答える
1

私が特に好きではないオプションの 1 つは、コントローラーのアクションに別の名前を付けてから、ActionName 属性を使用して名前を変更することです。

public ActionResult Login() {
    // ... code ...
    return View();
}

[HttpPost]
[ActionName("Login")]
public ActionResult LoginPost(... some params ...) {
    // ... more code ...
    return View();
}

これは基本的に、1 つの問題 (単体テストの命名) を別の問題 (コントローラーのコードが読みにくい) に置き換えます。それでも、このパターンは前述の問題を解決するため、魅力的であると感じるかもしれません。

于 2009-12-31T22:21:57.387 に答える
1

あなたの質問のものと同様の命名規則、つまりmethod_scenario_expected を使用します。パラメーターを渡す場合は、「シナリオ」の部分について詳しく説明する必要があると思います。読者にそれらの特別な点を知らせてください。

このようにテストに名前を付けると、より「TDD 指向」であり、BDD ではないことに注意してください。BDD テストの名前は、ルールと「動作」に関するものにする必要があります。

現在の命名規則ではコードの可読性が損なわれないと思われる場合は、自由に試してみて、自分に合ったものを見つけてください。

于 2010-08-02T06:23:38.647 に答える
1

これは、単体テストの厳格な命名規則が魅力的でない理由の完璧な例だと思います。

提案されたスキームは、2 つのメソッド オーバーロードがある場合にのみ機能します。1 つはパラメーターあり、もう 1 つはパラメーターなしです。異なるパラメーターを持つ複数のオーバーロードがあるシナリオには拡張されません。

個人的には、次のように要約できる、より緩い命名規則を好みます。

[Action][Will|Should|Is|...][Result]

これにより、テストに名前を付ける柔軟性が得られます

SutIsPathResolutionCommand
ExecuteWithNullEvaluationContextWillThrow
ExecuteWillAddDefaultClaimsTransformationServiceWhenNoConnectionServiceIsAvailable

とにかく、テストの名前を読むことはめったにないことを認めなければなりません。代わりに、それが何をするかの仕様 (つまり、テスト コード) を読みました。名前は私にとってそれほど重要ではありません。

于 2009-09-30T11:47:04.800 に答える
0

私はあなたの質問に答えていないかもしれませんが、私がしていることを共有したいと思います。私は特定の命名規則には従いませんが、どのテスト方法がテストしようとしているのかを説明する名前を付けようとしています。さらに説明が必要な場合は、説明を追加します[Test( "このテストは、特定のユーザーが回答した質問の数を評価します")]。

確認すべきことの1つは、テストがより読みやすく、すぐに理解できることです。

于 2010-03-04T10:31:27.920 に答える