NSubstitute またはその他のモック フレームワークと MSTest (Visual Studio 2010) を使用して Excel スプレッドシートをモックしようとしています。これよりも良い方法があるかどうかはわかりません-そして、これはテストにはうまくいきません:
以下に例を示します (これは現時点ではすべてプロトタイプ コードであり、あまりクリーンではありません)。
int[] lowerBounds = { 1, 1 };
int[] lengths = { 2, 2 };
//Initialize a 1-based array like Excel does:
object[,] values = (object[,])Array.CreateInstance(typeof(object), lengths, lowerBounds);
values[1,1] = "hello";
values[2,1] = "world";      
//Mock the UsedRange.Value2 property
sheet.UsedRange.Value2.Returns(values); 
//Test:   
GetSetting(sheet, "hello").Should().Be("world");  //FluentAssertions
GetSetting メソッドが私のテストと同じプロジェクトにある場合、これは合格です。ただし、GetSetting が VSTO Excel-Addin プロジェクトにある場合、GetSetting 関数の最初の行で次のエラーが発生して失敗します。
System.MissingMethodException: Error: Missing method 'instance object [MyExcel.AddIn] Microsoft.Office.Interop.Excel.Range::get_Value2()' from class 'Castle.Proxies.RangeProxy'.
参考までに、GetSetting はシートの列 A から値を取得し、列 B の値を返します。
public static string GetSetting(Excel.Worksheet sheet, string settingName) {
  object[,] value = sheet.UsedRange.Value2 as object[,];
  for (int row = 1; row <= value.GetLength(1); row++) {
    if (value[1, row].ToString() == settingName)
      return value[2, row].ToString();
  }
  return "";
}
最後の興味深い部分は、メソッドのシグネチャを次のように再定義した場合です: 
public static string GetSetting( dynamic sheet, string settingName)
 
VSTO プロジェクトで機能します。
では、何が起こっているのでしょうか。また、このようなことを行う最善の方法は何ですか?
ありがとう!