5

単体テストを作成するときに、Arrange-Act-Assert パターンに従おうとしていますが、どちらのアプローチが良いか混乱するところまで来ました。私は xUnit を使用していますが、問題に対する最初のアプローチは次のとおりです。

//Arrange
int key = 1;
string value = "X";

//Act
board.Add(key, value);
var result = Assert.Throws<ArgumentException>(() => board.Add(key, value));

//Assert
Assert.IsType<ArgumentException>(result);

私の2番目のアプローチは次のとおりです。

int key = 1;
string value = "X";

board.Add(key, value);

Assert.Throws<ArgumentException>(() => board.Add(key, value));

どちらがより良いアプローチですか?

編集: wp.me/p4f69l-3z でこれについてブログを書いた

4

5 に答える 5

6

あなたの最初の.Add電話は本当に手配の一部でなければなりません。行為の前提・準備として扱う。それ以外は、actをラップActionして読みやすくすることができます。

//Arrange
int key = 1;
string value = "X";
board.Add(key, value);

//Act
Action addingSameKeySecondTime = () => board.Add(key, value);

//Assert
Assert.Throws<ArgumentException>(addingSameKeySecondTime)

コメントで言及されているFluentAssertionsライブラリは、そのようなアサートをさらに文に似たものにします:

int key = 1;
string value = "X";
board.Add(key, value);

Action addingSameKeySecondTime = () => board.Add(key, value);

addingSameKeySecondTime.ShouldThrow<ArgumentException>();
于 2014-06-05T21:26:23.500 に答える
0

あなたの2番目の例の方が良いと思います。Assert.Throws はテストに合格/不合格になるため、結果を取得してアサートする理由はありません。'will throw' テストを書いているときは、1 行か 2 行にまとめます。

[Test]
public void SomeMethod_NullSomething_ShouldThrow() {
    var something = MakeTarget();

    Assert.Throws<ArgumentNullException>(() => something.SomeMethod(null));
}
于 2014-06-05T21:00:43.743 に答える