C# 对非虚拟(在VB中可重写)成员的验证无效:x=>;x、 AddOrUpdate<;TBL客户>;(新[]{It.IsAny<;tblCustomer>;()})

C# 对非虚拟(在VB中可重写)成员的验证无效:x=>;x、 AddOrUpdate<;TBL客户>;(新[]{It.IsAny<;tblCustomer>;()}),c#,unit-testing,asp.net-mvc-4,entity-framework-6,moq,C#,Unit Testing,Asp.net Mvc 4,Entity Framework 6,Moq,我从Moq得到了这个错误,对我来说没有什么意义 以下是我想嘲弄的主要方法 public int Add(Customer customer) { var result = 0; using (_entverasysEntities) { var doesCustExist = _entverasysEntities.tblCustomers.Any(cust => cust.CustomerName.Trim

我从Moq得到了这个错误,对我来说没有什么意义

以下是我想嘲弄的主要方法

public int Add(Customer customer)
    {
        var result = 0;

        using (_entverasysEntities)
        {
            var doesCustExist = _entverasysEntities.tblCustomers.Any(cust => cust.CustomerName.Trim() == customer.CustomerName.Trim() && cust.IsDelete.Value == false);
            if (!doesCustExist)
            {
                customer.CustomerId = Guid.NewGuid();
                customer.CreatedBy = customer.CustomerId;
                customer.UpdatedBy = customer.CustomerId;
                customer.CreatedDate = DateTime.Now;
                customer.UpdatedDate = DateTime.Now;
                customer.IsDeleted = false;
                customer.SpaceTypeId = 1;
                _entverasysEntities.tblCustomers.AddOrUpdate(Mapper.Map(customer, new tblCustomer()));
                result = _entverasysEntities.SaveChanges() > 0 ? (int)ReturnResult.Success : (int)ReturnResult.Failure;

                if (result == 1)
                {
                    // will be changed once the Unit Details are finalized 
                    customer.UnitMapping.CustomerId = customer.CustomerId;
                    customer.UnitMapping.CustomerUnitMappingId = Guid.NewGuid();
                    customer.UnitMapping.CreatedBy = customer.CustomerId;
                    customer.UnitMapping.UpdatedBy = customer.CustomerId;
                    customer.UnitMapping.CreatedDate = DateTime.Now;
                    customer.UnitMapping.UpdatedDate = DateTime.Now;
                    _entverasysEntities.tblCustomerUnitMappings.AddOrUpdate(Mapper.Map(customer.UnitMapping, new tblCustomerUnitMapping()));
                    result = _entverasysEntities.SaveChanges() > 0 ? (int)ReturnResult.Success : (int)ReturnResult.Failure;
                }
            }
            else
                result = (int)ReturnResult.RecordExist;
        }
        return result;
    }
单元测试

[TestMethod]
public void CustomerDataManager_AddCustomerTest()
{

    var custid = Guid.NewGuid();

    var customerData = new List<tblCustomer>
    {
        new tblCustomer {CustomerName="Enterprize",IsDelete=false},

    }.AsQueryable();


    var unitMappingData = new List<tblCustomerUnitMapping>
    {
        new tblCustomerUnitMapping { CustomerId=custid},
    }.AsQueryable();

    var mockContext = new Mock<ENTVERASYSEntities>();
    var mockCustomer = new Mock<DbSet<tblCustomer>>();
    var mockUnitMapping = new Mock<DbSet<tblCustomerUnitMapping>>();


    mockCustomer.As<IQueryable<tblCustomer>>().Setup(x => x.Provider).Returns(customerData.Provider);
    mockCustomer.As<IQueryable<tblCustomer>>().Setup(x => x.Expression).Returns(customerData.Expression);
    mockCustomer.As<IQueryable<tblCustomer>>().Setup(x => x.ElementType).Returns(customerData.ElementType);
    mockCustomer.As<IQueryable<tblCustomer>>().Setup(x => x.GetEnumerator()).Returns(customerData.GetEnumerator());
    mockCustomer.SetReturnsDefault(customerData.GetEnumerator());
    mockCustomer.Verify(x => x.AddOrUpdate(It.IsAny<tblCustomer>()),Times.Once());
    mockContext.Verify(x => x.SaveChanges(),Times.Once());

    mockUnitMapping.As<IQueryable<tblCustomerUnitMapping>>().Setup(x => x.Provider).Returns(unitMappingData.Provider);
    mockUnitMapping.As<IQueryable<tblCustomerUnitMapping>>().Setup(x => x.Expression).Returns(unitMappingData.Expression);
    mockUnitMapping.As<IQueryable<tblCustomerUnitMapping>>().Setup(x => x.ElementType).Returns(unitMappingData.ElementType);
    mockUnitMapping.As<IQueryable<tblCustomerUnitMapping>>().Setup(x => x.GetEnumerator()).Returns(unitMappingData.GetEnumerator());
    //mockUnitMapping.Verify(x => x.AddOrUpdate(new tblCustomerUnitMapping { CustomerId = custid, CustomerName = "Enterprize", CreatedBy = custid, UpdatedBy = custid, CreatedDate = DateTime.Now, UpdatedDate = DateTime.Now }));
    //mockContext.Verify(x => x.SaveChanges());


    mockContext.Setup(x => x.tblCustomers).Returns(mockCustomer.Object);
    //mockContext.Setup(x=>x.tblCustomers.AddOrUpdate()).re

    mockContext.Setup(t => t.tblCustomerUnitMappings).Returns(mockUnitMapping.Object);

    var service = new CustomerDataManager(mockContext.Object);


    int service2 = service.Add(new Customer { CustomerId = custid, CustomerName = "Enterprize1" ,CreatedBy=custid,UpdatedBy=custid,CreatedDate=DateTime.Now,UpdatedDate=DateTime.Now,SpaceTypeId=1});

    Assert.AreEqual(2, service2);
    Assert.AreEqual("Enterprize",service2);
    Assert.AreEqual(custid, service2);

}
[TestMethod]
public void CustomerDataManager\u AddCustomerTest()
{
var custid=Guid.NewGuid();
var customerData=新列表
{
新tblCustomer{CustomerName=“Enterprize”,IsDelete=false},
}.AsQueryable();
var unitMappingData=新列表
{
新的tblCustomerUnitMapping{CustomerId=custid},
}.AsQueryable();
var mockContext=new Mock();
var mockCustomer=new Mock();
var mockUnitMapping=new Mock();
mockCustomer.As().Setup(x=>x.Provider).Returns(customerData.Provider);
mockCustomer.As().Setup(x=>x.Expression).Returns(customerData.Expression);
mockCustomer.As().Setup(x=>x.ElementType).Returns(customerData.ElementType);
mockCustomer.As().Setup(x=>x.GetEnumerator()).Returns(customerData.GetEnumerator());
mockCustomer.SetReturnsDefault(customerData.GetEnumerator());
mockCustomer.Verify(x=>x.AddOrUpdate(It.IsAny()),Times.Once());
验证(x=>x.SaveChanges(),Times.Once());
mockUnitMapping.As().Setup(x=>x.Provider).返回(unitMappingData.Provider);
mockUnitMapping.As().Setup(x=>x.Expression)。返回(unitMappingData.Expression);
mockUnitMapping.As().Setup(x=>x.ElementType).Returns(unitMappingData.ElementType);
mockUnitMapping.As().Setup(x=>x.GetEnumerator()).Returns(unitMappingData.GetEnumerator());
//验证(x=>x.AddOrUpdate(新的tblCustomerUnitMapping{CustomerId=custid,CustomerName=“Enterprize”,CreatedBy=custid,UpdateBy=custid,CreatedDate=DateTime.Now,UpdateDate=DateTime.Now});
//验证(x=>x.SaveChanges());
mockContext.Setup(x=>x.tblCustomers).Returns(mockCustomer.Object);
//mockContext.Setup(x=>x.tblCustomers.AddOrUpdate()).re
Setup(t=>t.tblcustomeunitmappings).Returns(mockUnitMapping.Object);
var服务=新的CustomerDataManager(mockContext.Object);
int service2=service.Add(新客户{CustomerId=custid,CustomerName=“Enterprize1”,CreatedBy=custid,UpdatedBy=custid,CreatedDate=DateTime.Now,updatedate=DateTime.Now,SpaceTypeId=1});
主张平等(2,服务2);
断言.AreEqual(“Enterprize”,服务2);
Assert.AreEqual(custid,service2);
}
当我调试上面的测试方法时,下面这行抛出一个异常

mockCustomer.Verify(x => x.AddOrUpdate(It.IsAny<tblCustomer>()),Times.Once());
mockCustomer.Verify(x=>x.AddOrUpdate(It.IsAny()),Times.Once());
错误是

对非虚拟(在VB中可重写)成员的验证无效:
x=>
x、 AddOrUpdate(新[]{})


我不确定如何解决这个问题,我正在使用EF6和模型优先的方法。

Moq只能模拟虚拟成员
AddOrUpdate
显然不是虚拟的,因此它无法按照异常消息中的说明模拟它。因此,如果我将AddOrUpdate设置为虚拟的,那么在这种情况下它可以工作!!如果您控制该类并可以对其进行更新,那么您也可以在执行测试之前调用verify。好的,但是还有其他选项可以轻松地进行模拟吗