1

Machine.Fakes.NSubstitute入力パラメータが特定の値と一致する場合はモックオブジェクトを返し、そうでない場合はnullを返すように、戻り値を「偽造」したいと考えています。

私は次のことを試しました:

host.WhenToldTo(h => h.GetTenantInstance(Param.Is(new Uri("http://foo.bar"))))
    .Return(new TenantInstance());

ただし、次の例外がスローされます。

System.InvalidCastException:タイプ'System.Linq.Expressions.NewExpression'のオブジェクトをタイプ'System.Linq.Expressions.ConstantExpression'にキャストできません。

私の現在の回避策は、次のことを行うことです。

host.WhenToldTo(h => h.GetTenantInstance(Param.IsAny<Uri>()))
    .Return<Uri>(uri => uri.Host == "foo.bar" ? new TenantInstance() : null);

少し臭いです。

4

1 に答える 1

3

ここには3つの側面があります。

  1. 参照型の戻り値を持つメソッドがモックオブジェクトで呼び出され、その呼び出しに対して動作が設定されていない場合、モックオブジェクトはモックを返します。代わりに返すnull場合は、明示的に構成する必要があります。したがって、設定するだけでは不十分です

    host.WhenToldTo(h => h.GetTenantInstance(Param.Is(new Uri("http://foo.bar"))))
        .Return(new TenantInstance());
    

    また、次のような他のケースを設定する必要があります。

    host.WhenToldTo(h => h.GetTenantInstance(Param<Uri>.Matches(x => !x.Equals(new Uri("http://foo.bar")))))
        .Return((TenantInstance)null);
    

    あなたの「回避策」ソリューションは、これら2つのセットアップよりもエレガントだと思います。

  2. 等式のためにメソッド呼び出し引数を一致させる場合、を使用する必要はありませんParam.Is()。で動作を設定するだけです

    host.WhenToldTo(h => h.GetTenantInstance(new Uri("http://foo.bar")))
        .Return(new TenantInstance());
    
  3. Param.Is()ここで使用すると例外が発生するという事実は、 Machine.Fakesの欠点です。これが機能しない理由はわかりません。いつか修正してお知らせします。
于 2012-11-24T15:04:16.800 に答える