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