【发布时间】:2019-01-12 02:03:58
【问题描述】:
我有这个单元测试。它为我的IEmployeeService 测试UpdateEmployee 方法。
private readonly IEmployeeService _employeeService;
public EmployeeServiceTests()
{
var mockData = new List<Employee>
{
new Employee { Id = 0, FirstName = "Homer", LastName = "Simpson" },
new Employee { Id = 1, FirstName = "Carl", LastName = "Carlson" },
new Employee { Id = 2, FirstName = "Lenny", LastName = "Leonard" },
};
_employeeService = MockSetup.SetupEmployeeService(mockData);
}
[Fact]
public void UpdateEmployee_EmployeeExists_EmployeeGetsUpdated()
{
var homer = _employeeService.GetEmployee(0);
homer.FirstName = "Homer Jay";
_employeeService.UpdateEmployee(homer);
var actual = homer.FirstName;
var expected = _employeeService.GetEmployee(0).FirstName;
Assert.Equal(expected, actual);
}
这是我的UpdateEmployee() 代码:
public void UpdateEmployee(EmployeeDto employee)
{
var existingEmployee = _dbContext.Employees.SingleOrDefault(e => e.Id == employee.Id);
if (existingEmployee != null)
{
_dbContext.Employees.AddOrUpdate(employee.ToEntity());
}
else
{
throw new Exception("Employee does not exist");
}
}
这就是我的模拟设置的样子。我使用自定义方法来模拟AddOrUpdate:
public static Mock<MockDbSet<Employee>> CreateEmployeeMockSet(List<Employee> data)
{
var mockSet = new Mock<MockDbSet<Employee>>();
mockSet.As<IQueryable<Employee>>().Setup(m => m.Provider).Returns(data.AsQueryable().Provider);
mockSet.As<IQueryable<Employee>>().Setup(m => m.Expression).Returns(data.AsQueryable().Expression);
mockSet.As<IQueryable<Employee>>().Setup(m => m.ElementType).Returns(data.AsQueryable().ElementType);
mockSet.As<IQueryable<Employee>>().Setup(m => m.GetEnumerator()).Returns(data.AsQueryable().GetEnumerator());
mockSet.Setup(d => d.Add(It.IsAny<Employee>())).Callback<Employee>(e => data.Add(e));
mockSet.Setup(d => d.AddOrUpdate(It.IsAny<Employee>())).Callback<Employee>(e => UpdateList(e, data));
mockSet.Setup(d => d.Remove(It.IsAny<Employee>())).Callback<Employee>(e => data.Remove(e));
return mockSet;
}
private static void UpdateList(Employee employee, List<Employee> data)
{
var index = data.FindIndex(e => e.Id == employee.Id);
data[index] = employee;
}
很遗憾,更新不起作用。我收到此错误:
Message: Assert.Equal() Failure
↓ (pos 5)
Expected: Homer
Actual: Homer Jay
↑ (pos 5)
我哪里错了?
【问题讨论】:
-
您的
UpdateEmployee方法在代码中的什么位置? -
@TanvirArjel 我编辑了问题,对此感到抱歉
-
这是一个 ASP.NET Core 项目吗?
-
@TanvirArjel 这是.net framework 4.6.1
标签: c# entity-framework unit-testing moq