Microsoft.Office.Interop.Excel.Range (およびその他の Microsoft.Office.Interop.Excel インターフェイス) をモックして、アプリケーションの単体テストを行いたいと考えています。C# で .NET 4 で Moq 4.0.10827 を使用しています。
私の単体テストでは、モックの動作を次のように設定しようとしています。
var range = new Mock<Microsoft.Office.Interop.Excel.Range>();
range.Setup(r => r.get_Value(1)).Returns("Something");
var classBeingTested = new MyClass(range.Object);
単体テスト中のコードでは、Range を次のように使用しています。
public MyClass(Range range)
{
var value = range[1].ToString();
}
テストを実行すると、次の例外が生成されます。
Error: Missing method 'instance object [My.Example.Implementation.MyClass] Microsoft.Office.Interop.Excel.Range::get__Default(object,object)' from class 'Castle.Proxies.RangeProxy'.
このモッキングをうまく実装するにはどうすればよいですか? https://stackoverflow.com/a/9486226/1548950のようなパターンで Excel 相互運用機能を分離することが潜在的な解決策であることを認識しています。ただし、Microsoft.Office.Interop.Excel インターフェイスからモックを作成できれば、もっとうれしいです。
編集: この問題の詳細
わかりました、これは奇妙です。jimmy_keen による提案をテストするプロジェクトを作成しました。できます。ただし、問題があったプロジェクトをテストするために同じ提案を使用すると、次の例外がスローされます。
Error: Missing method 'instance object [My.Example.Implementation.MyClass] Microsoft.Office.Interop.Excel.Range::get__Default(object,object)' from class 'Castle.Proxies.RangeProxy'.
jimmy_keen の提案が他のプロジェクトでうまく機能したので、コードをテストしているプロジェクトに何か問題があるのではないかと疑い始めました。そこで、問題を詳細に示すテスト ソリューションを作成しました: http://www7.zippyshare.com/v/70834394/file.html
問題の根本は、プロジェクトに別のクラス (単体テストされていない) が含まれていることであり、基本的に次のコードが含まれているようです。
using Microsoft.Office.Interop.Excel;
namespace Project
{
public class UnTestedClass
{
public UnTestedClass(Worksheet sheet)
{
var foo = sheet.Range["Description"].Column;
}
}
}
単体テストで UnTestedClass をまったく使用していないため、これが問題を引き起こす理由がわかりません。Moq を使用する方法に何か欠けているのでしょうか、それともバグに遭遇しましたか?