C# 对非虚拟(在VB中可重写)成员的验证无效:x=>;x、 AddOrUpdate<;TBL客户>;(新[]{It.IsAny<;tblCustomer>;()})
我从Moq得到了这个错误,对我来说没有什么意义 以下是我想嘲弄的主要方法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
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。好的,但是还有其他选项可以轻松地进行模拟吗