MSpec (James Broome による AutoMocking を使用) と RhinoMocks を使用して、BDD/TDD を使い始めたばかりです。以下は、私の実践プロジェクトからの抜粋です。
namespace Tests.VideoStore.Controllers
{
public abstract class context_for_movie_controller :
Specification<MovieController>
{
private static IList<Movie> movies;
protected static IMovieRepository _movieRepository;
protected static ActionResult _result;
protected static string title;
protected static string director;
Establish context = () =>
{
_movieRepository = DependencyOf<IMovieRepository>();
};
}
[Subject(typeof(MovieController))]
public class when_searching_for_movies_with_director :
context_for_movie_controller
{
Establish context = () =>
{
title = null;
director = "James Cameron";
var movie4 = new Movie {
Title = "Terminator", Director = "James Cameron"};
var movie6 = new Movie {
Title = "Avatar", Director = "James Cameron"};
movies = new List<Movie> {movie4, movie6};
// Repository returns all movies.
_movieRepository.Stub(x => x.FindMovies(title, director))
.Return(movies);
};
Because of = () => _result = subject.Find(title, director);
It should_fetch_movies_from_the_repository = () =>
_movieRepository.AssertWasCalled(x =>
x.FindMovies(title, director));
It should_return_a_list_of_movies_matching_the_director = () =>
_result.ShouldBeAView().And()
.ShouldHaveModelOfType<IEnumerable<Movie>>)
.And().ShouldContainOnly(movies);
}
ご覧のとおり、MovieRepository クラスの FindMovies() メソッドをスタブ化しました。次に、MoviesController.Find() アクションを呼び出しています。私の質問は、スタブ化されたメソッド (FindMovies) がコントローラーによって呼び出されたかどうかを確認するアサートが必要ですか? それとも、結果がどこから取得されたかではなく、返された結果だけを気にする必要がありますか? さらに、「should_fetch_movies_from_the_repository」と書かれた仕様はエンジニアリング タスクのように見えますが、クライアントが理解できるものではありません。BDD でその場所があるのでしょうか?