ASP.Net MVC TDD с использованием Moq - PullRequest
1 голос
/ 30 декабря 2010

Я пытаюсь изучить TDD / BDD, используя NUnit и Moq.

Проект , за которым я следовал, передает класс DataService в мой контроллер для обеспечения доступа к репозиториям.

Я хотел бы смоделировать класс DataService, чтобы разрешить тестирование контроллеров.

Есть много примеров смоделирования репозитория, переданного в контроллер, но я не могу понять, как смоделировать DataServiceкласс в этом

scenerio.

Может кто-нибудь объяснить, как это реализовать?

Вот пример соответствующего кода:

[Test]
public void Can_View_A_Single_Page_Of_Lists()
{
    var dataService = new Mock<DataService>();

    var controller = new ListsController(dataService); 

    ...
}



namespace Services
{
    public class DataService
    {
        private readonly IKeyedRepository<int, FavList> FavListRepository;
        private readonly IUnitOfWork unitOfWork;

        public FavListService FavLists { get; private set; }

        public DataService(IKeyedRepository<int, FavList> FavListRepository,
        IUnitOfWork unitOfWork)
        {
            this.FavListRepository = FavListRepository;
            this.unitOfWork = unitOfWork;

            FavLists = new FavListService(FavListRepository);
    }

        public void Commit()
        {
            unitOfWork.Commit();
        }

    }
}



namespace MyListsWebsite.Controllers
{
    public class ListsController : Controller
    {
        private readonly DataService dataService;

        public ListsController(DataService dataService)
        {
            this.dataService = dataService;
        }


        public ActionResult Index()
        {
            var myLists = dataService.FavLists.All().ToList();

            return View(myLists);
        }

    }
}

1 Ответ

2 голосов
/ 30 декабря 2010

Создайте такой интерфейс:

public interface DataService
{
    FavListService FavLists { get; }
    void Commit();
}

Заставьте ваш DataService реализовать этот интерфейс, и ваш контроллер должен зависеть от этого интерфейса. Проблема решена:)

РЕДАКТИРОВАТЬ: Эта строка кода:

dataService.FavLists.All().ToList();

нарушает закон деметры и станет проблемой для юнит-тестирования вашего сервиса. Создайте метод, подобный AllFavList(), в вашем сервисе вместо всех этих цепочек вызовов, будет проще издеваться.

РЕДАКТИРОВАТЬ2: Как издеваться над тем, чтобы получить собственность

dataService.SetupGet(d => d.FavLists).Returns(your_variable);
...