ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

C#-单元测试-更新模型

2019-11-19 18:04:59  阅读:339  来源: 互联网

标签:unit-testing nunit moq c entity-framework


我是单元测试的新手,我试图编写一个测试来验证在更新用户对象时是否正在更新正确的字段.我的单元测试如下:

[Test]
public void ShouldUpdateExistingEmployee()
{
    var employees = new Employee[]
    {
        new Employee()
        {
            EmployeeId = 1,
            FirstName = "Johhn",
            LastName = "Smiths",
            Email = "John.Smith1@Illinois.gov",
            IsActive = true
         }
    };

    var mockContext = new Mock<SqlContext>();
    mockContext.Setup(e => e.Employees).ReturnsDbSet(employees);
    mockContext.Setup(m => m.Employees.Find(It.IsAny<object[]>()))
         .Returns<object[]>(
                  ids => employees.FirstOrDefault(d => d.EmployeeId == (int)ids[0]));

    var sut = new EmployeeRepository(mockContext.Object);

    var employeeToUpdate = new Employee
    {
        EmployeeId = 1,
        FirstName = "John",
        LastName = "Smith",
        Email = "John.Smith@Illinois.gov",
        IsActive = true
    };

    sut.Save(employeeToUpdate);

    Assert.That(employees.First().FirstName, Is.EqualTo(employeeToUpdate.FirstName));
    Assert.That(employees.First().LastName, Is.EqualTo(employeeToUpdate.LastName));
    Assert.That(employees.First().Email, Is.EqualTo(employeeToUpdate.Email));
}    

我的存储库如下所示:

public void Save(Employee employee)
{
    if (employee.EmployeeId > 0)
    {
        Employee dbEmployee = Context.Employees.Find(employee.EmployeeId);
        Context.Entry(dbEmployee).CurrentValues.SetValues(employee);
    }
    else
    {
        Context.Employees.Add(employee);
    }

    Context.SaveChanges();
}

问题是当我进入Context.Entry(dbEmployee).CurrentValues.SetValues(employee);在我的存储库中,出现以下错误:无法为类型为’Employee’的实体调用成员’CurrentValues’,因为该实体在上下文中不存在.要将实体添加到上下文,请调用DbSet< Employee>的Add或Attach方法.

任何帮助,将不胜感激!

解决方法:

基于this article,您应该更改:

Employee dbEmployee = Context.Employees.Find(employee.EmployeeId);
Context.Entry(dbEmployee).CurrentValues.SetValues(employee);

至:

Context.Employees.Attach(employee)

然后,您应该更改断言以验证是否使用employeeToUpdate调用了Attach方法.(您将DBSet<>隐藏在ReturnDbSet方法中,因此我无法添加示例…)

还有一件事,我认为您应该看一下this code snippet,它显示了模拟DBContext和DBSet<>的正确方法.使用起订量.或read this article

标签:unit-testing,nunit,moq,c,entity-framework
来源: https://codeday.me/bug/20191119/2038024.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有