6

現在、ソフトウェア製品のコード カバレッジを拡大している最中に問題が発生しました。「BadImageFormatException」をスローするため、すべての単体テスト (「任意の CPU」を使用してコンパイルした場合) が失敗します。

この例外は、「Any CPU」の代わりに「x86」を使用してソリューションを構築することで回避できますが、Any 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でビルドした場合、このテストが成功することを確認できます。「Any CPU」を使用して構築したときに Moq をうまくプレイさせる方法について、誰かアイデアはありますか?

余談ですが、ソリューション内のすべてのプロジェクトが同じ値 (「任意の CPU」) を使用してビルドされていることも確認できます。Moq v4.0 を使用しています。

編集: 完全な例外は次のとおりです: テスト メソッド [ProductName と呼び出されたメソッド] が例外をスローしました: System.BadImageFormatException: ファイルまたはアセンブリを読み込めませんでした '[製品名]、バージョン = 1.0.0.0、カルチャ = ニュートラル、PublicKeyToken = null'またはその依存関係の 1 つ。不正な形式のプログラムをロードしようとしました。

4

2 に答える 2

13

わかりましたので、掘り下げた後、ようやく問題が何であるかがわかりました。ツールバーから「ビルド」を選択してから「構成マネージャー」を選択し、プラットフォームが「任意の CPU」に設定されていることを確認しても (私の場合のように)、プロジェクトでターゲット プラットフォームを確認していませんでした。

ターゲット プラットフォームを確認するには、次の手順を実行する必要があります。

  • プロジェクトを右クリックし、[プロパティ] を選択します。
  • 左側の「ビルド」タブを選択します
  • テスト プロジェクトのターゲット プラットフォームが、テストしているプロジェクトのターゲット プラットフォームと一致していることを確認します。

私の場合、テストは「任意の CPU」をターゲットにしていましたが、ライブ プロジェクトは「x64」をターゲットにしていました。これが問題の原因でした。

于 2016-01-28T14:45:24.600 に答える
1

これは、プロジェクトまたは他のアセンブリ参照が見つからないことが原因である可能性があります。ソリューション内のすべてのプロジェクトのプロジェクト参照があることを確認してください。

この投稿にはさらに例があります。

于 2016-01-28T14:04:53.283 に答える