【问题标题】:ASP.Net MVC TDD using Moq使用 Moq 的 ASP.Net MVC TDD
【发布时间】:2010-12-30 16:38:58
【问题描述】:

我正在尝试使用 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);
        }

    }
}

【问题讨论】:

    标签: asp.net tdd moq


    【解决方案1】:

    创建一个这样的界面:

    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);
    

    【讨论】:

    • @Oenning - 谢谢。我已经提取了接口(数据服务现在实现了这个)并将控制器代码更改为私有只读 IDataService 数据服务; public ListsController(IDataService dataService){ this.dataService = dataService;现在测试是 var dataService = new Mock(); var controller = new ListsController(dataService); - 我收到一个无效的参数错误。我还需要带我过线吗?
    • 试试这个new ListsController(dataService.Object);
    • @Oenning - 现在试试这个
    • @Oenning - 是的,这在一定程度上有效,但是如果 FavLists 只是获取,我如何用一些测试数据填充 FavList?
    • @Oenning - 不幸的是,当我键入 dataService 时,智能感知中缺少 SetupGet。或 dataService.object - 我还遗漏了什么吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-02-15
    • 1970-01-01
    • 2011-08-07
    • 2010-11-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多