使用Moq的ASP.Net MVC TDD

时间:2010-12-30 16:38:59

标签: asp.net tdd moq

我正在尝试使用NUnit和Moq来学习TDD / BDD。

我一直关注的design将DataService类传递给我的控制器,以提供对存储库的访问。

我想模拟DataService类以允许测试控制器。

有许多模拟传递给控制器​​的存储库的例子,但我无法弄清楚如何在这个模拟DataService类

之情况。

有人可以解释一下如何实现这个吗?

以下是相关代码的示例:

[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 个答案:

答案 0 :(得分:2)

创建一个这样的界面:

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

让您的DataService实现此接口,您的控制器应该依赖于此接口。问题解决了:))

编辑:这行代码:

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

打破了law of demeter,对您的服务进行单元测试会很麻烦。在您的服务上创建一个类似AllFavList()的方法而不是所有这些调用链,它会更容易模拟。

EDIT2:如何模拟你获得财产

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