我有这个界面:
public interface IProductsRepository
{
// Use this method for non transactional commits, and return the new primary key.
Task<int> CreateNewProductItem(ProductExt product);
// use this method for transactional commits, and return the new primary key
Task<int> CreateNewProductItem(ProductExt product, MySqlConnection conn, MySqlTransaction transaction);
现在我正在尝试编写一些Moq设置:
Mock<IProductsRepository> _ProductRepositoryMoq = new Mock<IProductsRepository>();
_ProductRepositoryMoq.Setup(r => r.CreateNewProductItem(It.IsAny<ProductExt>()))
.ReturnsAsync((ProductExt p) =>
{
p.ID = productList.Last().ID + 1;
return p.ID;
});
_ProductRepositoryMoq.Setup(r => r.CreateNewProductItem(It.IsAny<ProductExt>(), It.IsAny<MySqlConnection>(), It.IsAny<MySqlTransaction>()))
.ReturnsAsync((ProductExt p, MySqlConnection c, MySqlTransaction t) =>
{
p.ID = productList.Last().ID + 1;
return p.ID;
});
当我尝试运行单元测试时,在它发生之前,我收到此错误:
System.MissingMethodException
HResult=0x80131513
Message=Method not found: 'System.Threading.Tasks.Task`1<Int32>
Repositories.ProductManager.IProductsRepository.CreateNewProductItem(ProductManagerModels.ProductExt, MySql.Data.MySqlClient.MySqlConnection, MySql.Data.MySqlClient.MySqlTransaction)'.
我不明白。这个方法是以通常的方式定义的,并且它清晰可见,那么为什么Moq会抛出一个无法找到的新东西CreateNewProductItem(product,MySqlConnection,MySqlTransaction)??
注意:我已经尝试在所有项目中修改所有bin / obj以强制VS 2017重建整个解决方案,虽然不太可能,但我确实看到GAC中是否存在远程可能性,但是我的项目中没有一个项目被放入GAC。因此,它已经在其他地方。
第二个注意:正如我所说,这是 之前 我在[TestInitialize]方法中运行任何单元测试。我使用MSTest进行单元测试。现在有趣的是,我编写了一个尖峰来直接使用数据库而不是Moq,并且没有系统。抛出了方法管理异常。我还验证了数据确实已在MySQL数据库中插入和/或更新。