使用Moq测试重载方法,获取System.MissingMethodException:" Method Not Found"

时间:2017-12-15 11:04:22

标签: c# unit-testing moq

我有这个界面:

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数据库中插入和/或更新。

0 个答案:

没有答案