質問
書い私の最初のMSpec仕様ですし、私も指導します。私は"仕様"の"保留"状態でのコンテキストが補完されます。が改善されますか?
参考までに、そうした思いを込めて、最初にシナリオ:
Story: "Blog admin logs in to the system"
As a blog writer
I want to be able to log in to my blog
So that I can write posts and administer my blog
Scenario: "Logs in from the login page"
Given the user enters in correct credentials for a user in the system
When the user clicks the "Login" button
Then log the user in and redirect to the admin panel with a message
stating that he logged in correctly
のMSpecコード(一部snipped)ので、こった別名にMSpec It
委譲による紛争と Moq.It
:
using MoqIt = Moq.It;
using ThenIt = Machine.Specifications.It;
[Subject("User tries logging in")]
public class When_user_enters_valid_credentials : With_user_existing_in_membership
{
protected static ActionResult result;
Because of = () =>
{
result = loginController.Login(validUsername, validPassword);
};
ThenIt should_log_the_user_in;
ThenIt should_redirect_the_user_to_the_admin_panel;
ThenIt should_show_message_confirming_successful_login;
}
public abstract class With_user_existing_in_membership
{
protected static Mock<ISiteMembership> membershipMock;
protected static string validUsername;
protected static string validPassword;
protected static LoginController loginController;
Establish context =()=>
{
membershipMock = new Mock<ISiteMembership>();
validUsername = "ValidUsername";
validPassword = "ValidPassword";
//make sure it's treated as valid usernames and password
membershipMock
.Setup<bool>(m => m.Validate(
MoqIt.Is<string>(s => s == validUsername),
MoqIt.Is<string>(s => s == validPassword)))
.Returns(true);
loginController = new LoginController(membershipMock.Object);
};
}
解決
こんじゃないでしょうか。私のようにするに相反する It
との別名となります。いうのMoqエイリアスを良くすることができます。考えてい文です。例えば、 Param.Is<T>
または Value.Is<T>
.
一部のノート、コードスニペットを、その全体の仕様書き換えを行います。
シナリオにお Subject
のできるシナリオからの話です。プラスで描画されると試運転報告(特に素敵なHTMLレポート
[Subject("Login Page")]
無駄な時間"を"名前ベースの授業
MSpecクリエーターベJensen, は元に戻 からの使用"を"構文です。コンテキストクラスの名前なる報告のないようにしてください時間を費や創意味のある名前です。
public abstract class MembershipContext
指定されたお仕様クラス名
名前のコンクリート仕様のクラスは、指定されたお話です。特にその基底クラス名な報告でもどこでもしてしまう可能性もあります。失半コンテキスト、レポート!めしまうの名前のシステムの下での試験がコンテキストクラス名です。その文脈に反にリファクタリングシステムなければなりません。
public class When_an_existing_user_enters_valid_credentials
ベース仕様の授業は一般の初期化
が不要となります。そして、その分離の手法です。使用基底クラス共通の分野で初期化設定の英依存関係.ものではありませんの模擬挙動基底クラスです。さらには入れないでコンテキスト固有の情報を基底クラスです。おとえば、ユーザ名/パスワードになります。この方法を作成できる第二のコンテキストは無効情報。
Establish context = () =>
{
membership = new Mock<ISiteMembership>();
loginController = new LoginController(membership.Object);
};
分野のコンクリート仕様のクラスのprivateである必要があ
減少させることで、"式"の言語にテストです。おいて以下のすべてのMSpec特定の代表者については、これらの部品のスペックだものです。
static ActionResult result;
のスペックオーバーホール
仕様はこちらではのグローバルな文脈 MembershipContext
と受け継がれのコラボレーションに特有の仕様(このように追加 Establish
).
[Subject("Login Page")]
public class When_an_existing_user_enters_valid_credentials : MembershipContext
{
Establish context = () =>
{
membership
.Setup<bool>(m => m.Validate(
Param.Is<string>(s => s == username),
Param.Is<string>(s => s == password)))
.Returns(true);
};
Because of = () => result = loginController.Login(username, password);
It should_log_the_user_in;
It should_redirect_the_user_to_the_admin_panel;
It should_show_message_confirming_successful_login;
static ActionResult result;
const string username = "username";
const string password = "password";
}
public abstract class MembershipContext
{
Establish context = () =>
{
membership = new Mock<ISiteMembership>();
loginController = new LoginController(membership.Object);
};
protected static Mock<ISiteMembership> membership;
protected static LoginController loginController;
}