我想模拟下面的代码行(通过MOQ在C#,MVC中): -
CustomerDto target = CustomerService.GetAllCustomer().FirstOrDefault(n => n.CustomerID == customer.CustomerID);
其中CustomerService.GetAllCustomer()函数是控制器方法中的依赖项。
它在哪里使用FirstOrDefault()函数。在单元测试中,我不知道如何模拟它。
任何人都可以建议我这样做吗?
答案 0 :(得分:7)
模拟(存根)您的依赖。在这种情况下,它是CustomerService,它应该是一些接口或抽象类实现。 使您的GetAllCustomer方法返回一些假客户。 FirstOrDefault是一个不应该测试的.NET Framework方法(它已经由框架开发人员测试过)
答案 1 :(得分:0)
IMO,您需要通过更加分层的方法开始解耦代码。我不太确定你需要通过模拟FirstOrDefault方法来实现什么。我建议有三层,他们的测试如下 -
数据访问 - 使用EF及其DB上下文并实现数据访问接口。你应该在不模仿EF的db上下文的情况下进行单元测试。对这一层的测试将是" state"依赖。我的意思是,您的测试将与CRUD操作的真实数据和数据库一起使用。您只需确保在测试运行后不将更改保留到db。可以使用Spring.Net的测试库来实现这一点,或者只是在事务范围内运行测试,并在每次测试运行后回滚事务(在清理中)。
业务逻辑 - 包含业务逻辑并与数据访问接口协同工作。使用任何DI框架(如spring.net或ms unity)来注入数据访问层。您应该通过尝试避免实际数据库调用来对此进行单元测试。这就是像NMock,Rhinomock或MOQ这样的东西。使用模拟设置边界和异常条件,并确保您的业务逻辑解决所有问题。
MVC控制器 - 将调用委托给业务逻辑层,并且最有可能处理UI上需要的通知等内容。如果控制器确实需要进行单元测试,那应该是判断。这可能比经常更难。我宁愿建议使用像selenium或Microsoft的编码UI测试这样的自动UI测试用例。