c# - 模拟 Get 方法在 mstest 中不起作用
问题描述
我有一个名为 EmployeeService 的业务类,它有一个方法 GetProjectsByEmpId 和代码如下
public List<Project> GetProjectsByEmpId (int id) {
return this.empRepository.Get(e=>e.empId == id, e=>e.Projects).Projects;
}
和 Get 方法 synatx 是
T Get(Expression<Func<T, bool>> predicate, params Expression<Func<T, object>>[] includes);
我的测试用例是
private Mock<IEmployeeRepository> mockEmpRep;
[TestInitialize]
public void setup()
{
mockEmpRep= new Mock<IEmployeeRepository>();
myClass= new EmployeeService(mockEmpRep.Object);
}
和测试方法是
[TestMethod]
public void Test_GetProjectsByEmpId() {
this.mockEmpRep.Setup(m=> m.Get(
It.IsAny<Expression<Func<Employee, bool>>>(),
It.IsAny<Expression<Func<Employee, object>>>())).Returns(mockResult);
var res = myClass.GetProjectsByEmpId(1);
}
和 mockResult 是
new Employee { id: 1, projects: List<Project>()}
我试图模拟所有可能的值,但我得到“参数计数不匹配”。错误。
如果我在这里做错了什么,请告诉我。提前感谢您的帮助和感谢。
解决方案
这是我的完整工作示例。您能否验证并告诉我我的解决方案和您的代码之间的区别?
using Microsoft.VisualStudio.TestTools.UnitTesting;
using Moq;
using System;
using System.Collections.Generic;
using System.Linq.Expressions;
namespace UnitTestProject1
{
public class Project { }
public class Employee
{
public int EmpId { get; set; }
public List<Project> Projects { get; set; }
}
public class EmployeeService
{
readonly IEmployeeRepository<Employee> empRepository;
public EmployeeService(IEmployeeRepository<Employee> repository)
{
empRepository = repository;
}
public List<Project> GetProjectsByEmpId(int id)
{
return empRepository.Get(e => e.EmpId == id, e => e.Projects).Projects;
}
}
public interface IEmployeeRepository<T>
{
T Get(Expression<Func<T, bool>> predicate, params Expression<Func<T, object>>[] includes);
}
[TestClass]
public class UnitTest1
{
[TestMethod]
public void TestMethod1()
{
var mockEmpRep = new Mock<IEmployeeRepository<Employee>>();
var mockResult = new Employee() { Projects = new List<Project> { new Project() } };
mockEmpRep.Setup(
x => x.Get(
It.IsAny<Expression<Func<Employee, bool>>>(),
It.IsAny<Expression<Func<Employee, object>>>())
).Returns(mockResult);
EmployeeService myClass = new EmployeeService(mockEmpRep.Object);
List<Project> result = myClass.GetProjectsByEmpId(1);
Assert.AreEqual(1, result.Count);
}
}
}
推荐阅读
- sql - 对于每个唯一条目,包括另一个列表中的所有行
- python-3.x - 循环运行 POST API
- ios - 从XIB创建的UICollectionViewCell会导致拖放时闪烁
- r - 如何为每个方面构建一个具有各自比例的热图,而不是在 r 中为所有人构建一个通用比例?
- typescript - 如何在 ESNext 之前获取类中未初始化的静态属性的名称?
- qt - Qt:使用 QPainter::begin() 处理“将打印输出另存为”对话框
- python - 面对 ValueError:形状 (None, None) 和 (None, 256, 256, 12) 不兼容
- c++ - 如何为 STL 制作 C++ 编译器支持模板?
- asp.net - 从另一个控制器获取带有参数的 returnUrl
- r - 如果多列具有负值,则添加新列