ASP.NET MVCはMSpecでテストします。これは正しいですかリファクタリングを必要ですか?
-
18-09-2019 - |
質問
私はMSpecに新たなんだと私はASP.NET MVCのための私のテストを書いた方法が正しいかどうかを知りたいと思います。テストはパスしたが、私はそれが書かれている方法のように、本当にない、それは厄介なようです。私は確かに何かが欠けています。
public class AccountControllerTests3
{
protected static AccountController controller;
static IFormsAuthenticationService formsService;
static IMembershipService membershipService;
protected static ActionResult result;
protected static LogOnModel model;
Establish context = () =>
{
var controllerBuilder = new TestControllerBuilder();
formsService = MockRepository.GenerateStub<IFormsAuthenticationService>();
membershipService = MockRepository.GenerateStub<IMembershipService>();
model = MockRepository.GenerateStub<LogOnModel>();
controller =
controllerBuilder.CreateController<AccountController>(new object[]
{
formsService,
membershipService
});
};
Because user_logs = () =>
{
bool rememberMe = false;
membershipService.Stub(
x => x.ValidateUser("bdd", "mspec")).Return(true);
formsService.Stub(x => x.SignIn("bdd", rememberMe));
controller.ModelState.IsValid.ShouldBeTrue();
};
}
[Subject(typeof(AccountController), "LogInTests")]
public class When_logging_into_application_with_good_login_and_password : AccountControllerTests3
{
private It user_should_be_redirected_to_the_home_page = () =>
{
model.UserName = "bdd";
model.Password = "mspec";
result = controller.LogOn(model, string.Empty);
result.AssertActionRedirect().ToAction<HomeController>(
x => x.Index());
};
}
[Subject(typeof(AccountController), "LogInTests")]
public class When_logging_into_application_with_bad_login_and_password : AccountControllerTests3
{
It The_error_message_should_be_shown = () =>
{
model.UserName = "BAD";
model.Password = "BAD";
result = controller.LogOn(model, string.Empty);
controller.ModelState[""].Errors[0].ErrorMessage.ShouldEqual(
"The user name or password provided is incorrect.");
};
}
事前のおかげで、
トーマス
解決
私はMSpecでテストを書く私の目標の一つは、「アサート」または「それ」1行までを取得することです。 MSpecは、それが唯一のコンテキストを実行していることでNUnitのようにされていません(現在のクラスから確立句と、すべての基底クラスと理由句で構成された)一回の仕様(この条項)のすべてが続きます。
このはそれ節で任意の動作を行わないためにあなたを強制的に明示的に設計されたのではなく、それを観察しています。
あなたが実際にここでやっている何NUnitのようMSpecを使用しています。 (何の継承を使用していない)、単一のクラスのテストを試してみて、書き換えます。 ...後方作業これで、あなたが主張したいのかをアサート単一ラインを配置します。おそらく、AssertRedirect。試してみて、の一行を入れ原因となる、のではの観測では観測可能にします。これはおそらく、コントローラのログオン方法にお電話になります。最後に、「確立状況」にあなたが他のすべてを入れたいと思います。
しばらくして、あなたはの唯一の基底クラスにコンテキストを確立し、そうすることで、理解の面であなたの全体のサブクラスが一人で立っていることを確認することで物事の一部をプルする場合があります。読者は、実際の仕様が何をしているかを理解するために、基本クラスを読んでする必要はありません。それは儀式の実装の詳細を隠蔽するためにOKですが、わかりやすいメソッド名の後ろにそれらを隠すようにしてください。
私はわからないんだけど、他の行があります:
controller.ModelState.IsValid.ShouldBeTrue();
これはテストであれば、それはおそらく、独自これ句にする必要があります。本当にけれども、あなたはこれをテストしたいですか?あなたはここで何をテストしていますか?あなたのコントローラは、モデルが有効であるかどうかに基づいて行動を取るべきではないでしょうか。そのアクションの結果は、(検証エラーの代わりに、ログインエラー)に観察すべきではありません。あなたが本当にテストする必要がある場合、私はちょうど疑問に思うのこのの
いくつか他のものは、第1のR#とスタイリングのために、チェックアウトし、それはあなたのテストはR# 'sのデフォルトの犠牲に下落しているようです。私はここにこれを戦う方法について投稿します:
<のhref = "http://codebetter.com/blogs/aaron.jensen/archive/2008/10/19/getting-resharper-and-vs-to-play-nice-with-mspec.aspx" rel = "nofollowをnoreferrer"> http://codebetter.com/blogs/aaron.jensen/archive/2008/10/19/getting-resharper-and-vs-to-play-nice-with-mspec.aspx
また、ジェームズ・ブルームは、チェックアウトする価値があるいくつかの素晴らしいMVC MSpec拡張子を持っています:
http://jamesbroo.me/introducing-machinespecificationsmvc/する
幸運とお楽しみください!あなたが他の無関係な質問がある場合はTwitterで私にpingを実行すること自由に感じています。
他のヒント
ここでの発言です:代わりに、それはコンパイル時に安全かつ友好リファクタリングあるので、CreateController
方法の使用InitializeController
を使用します。
の代わりに:
controller = controllerBuilder.CreateController<AccountController>(
new object[] { formsService, membershipService });
実行します:
controller = new AccountController(formsService, membershipService);
controllerBuilder.InitializeController(controller);
あなたは、コントローラのコンストラクタの引数を変更し、第二は、コンパイル時エラーが発生する一方、それは、実行時に爆破する場合は、最初はまだコンパイルされます。