6

我目前正在增加我们软件产品的代码覆盖率并且遇到了问题;由于抛出“BadImageFormatException”,我的所有单元测试(使用“任何 CPU”编译时)都失败了。

可以通过使用“x86”而不是“任何 CPU”构建解决方案来规避此异常,但是要求是我们需要能够使用任何 CPU/x64 位运行它们。

所有涉及 Moq 的单元测试都遵循几乎相同的格式:

[TestMethod]
public void GetProduct_ValidId_ProductReturned()
{
    //Setting up the object
    Product prod = new Product();
    prod.ID = 7;
    prod.Name = "Test";

    //Create the mocks
    var mockProductRepo = new Mock<IRepository<Product>>();
    var testDb = new Mock<IUnitOfWork>();

    //Setup what the repo needs to return, in this case it's a Product
    mockProductRepo.Setup(m => m.getByID(7)).Returns(prod); 

    //Setup what the database needs to return, in this case it's our repo which we've already setup
    testDb.SetupGet(m => m.ProductRepo).Returns(mockProductRepo.Object);

    //Run the test
    Product returnedProd = ProductHelper.getProduct(testDb.Object, 7);
    Assert.IsNotNull(returnedProd);
}

我可以确认这个测试在使用 x86 构建时是成功的。有没有人知道如何让 Moq 在使用“任何 CPU”构建时发挥出色?

顺便说一句,我还可以确认我在解决方案中的所有项目都是使用相同的值(“任何 CPU”)构建的。我正在使用 Moq v4.0。

编辑:这是完整的异常:测试方法 [ProductName 和调用的方法] 抛出异常:System.BadImageFormatException:无法加载文件或程序集'[产品名称],版本 = 1.0.0.0,文化 = 中性,PublicKeyToken = null'或其依赖项之一。试图加载格式不正确的程序。

4

2 回答 2

13

好的,经过一番挖掘,我终于发现了问题所在。即使您从工具栏中选择“构建”,然后选择“配置管理器”并看到平台设置为“任何 CPU”(就像我的情况一样),我还没有做的是检查项目中的目标平台

要检查目标平台,您需要执行以下操作:

  • 右键单击您的项目并选择“属性”
  • 选择左侧的“构建”选项卡
  • 确保您的测试项目的目标平台与您正在测试的项目的目标平台相匹配

就我而言,我的测试目标是“任何 CPU”,但我的实时项目目标是“x64”。这就是导致问题的原因。

于 2016-01-28T14:45:24.600 回答
1

这可能是由于缺少项目或其他程序集引用造成的。尝试确保您的解决方案中的所有项目都有项目引用。

这篇文章还有一个例子。

于 2016-01-28T14:04:53.283 回答