Проблема заключается в следующей строке действия вашего контроллера:
var repository = new PostsRepository();
Здесь вы привязываете свой контроллер к конкретной реализации репозитория, что очень затрудняет модульное тестирование в изоляции.Чтобы добиться более слабой связи между вашим контроллером и уровнем доступа к данным, я бы порекомендовал вам использовать инжектор конструктора:
public class PostsController: Controller
{
private readonly IPostsRepository _repository;
public PostsController(IPostsRepository repository)
{
_repository = repository;
}
public ActionResult Index()
{
var posts = _repository.GetAllPosts();
return View(posts);
}
}
Теперь ваш контроллер полностью отделен от конкретной реализации репозитория, которая может зависеть от базы данных,и т. д. Теперь вы можете использовать фальшивый фреймворк, такой как Rhino Mocks или Moq , чтобы обеспечить фиктивную реализацию этого хранилища для модульного теста. MVCContrib TestHelper , который работает с Rhino Mocks и позволяет проводить очень элегантные модульные тесты действий контроллера.Поэтому, как только вы показали, что вы отсоединили свой контроллер от конкретной реализации репозитория, у вас может быть следующий модульный тест:
[TestMethod]
public void PostsController_Index_Action_Should_Fetch_All_Posts_From_Repository()
{
// arrange
var postsRepositoryStub = MockRepository.GenerateStub<IPostsRepository>();
var sut = new PostsController(postsRepositoryStub);
var expectedPosts = new Post[0];
postsRepositoryStub.Stub(x => x.GetAllPosts).Return(expectedPosts);
// act
var actual = sut.Index();
// assert
actual
.AssertViewRendered()
.WithViewData<IEnumerable<Post>>()
.ShouldBe(expectedPosts);
}