2

ref 引数を持つメソッドをモックできないという問題があります。モックしたいメソッドのシグネチャは次のとおりです。

class ContractRepository
...
public long GetValueAndIncrement(ref Counter counter)
{
 ...
}

私はこのようにそれを嘲笑しようとしました:

Random myRandomizer = new Random();
var contractRepo = new SIContractRepository();
contractRepo.GetValueAndIncrementCounterRef = ((internalCounter) => Int64.Parse(myRandomizer.Next().ToString()));

しかし、コンパイラは「ref」キーワードが欠落していることを教えてくれますが、このように試してみると

Random myRandomizer = new Random();
var contractRepo = new SIContractRepository();
contractRepo.GetValueAndIncrementCounterRef = ((ref internalCounter) => Int64.Parse(myRandomizer.Next().ToString()));

ref が無効な式であるというエラーが表示されます

残念ながら、Google はここでは役に立ちません。:( 何か案は?

4

4 に答える 4

1

refキーワードで匿名メソッドを使用できます。匿名メソッドで型を明示的に指定するだけです。

(ref Counter internalCounter) => Int64.Parse(myRandomizer.Next().ToString())
于 2011-05-04T14:33:48.853 に答える
1

この場合、匿名メソッドを使用することはできません。これらは ref パラメーターも out パラメーターもサポートしていないためです。「実際の」メソッドを作成する必要があります。

public void SetupMock()
{
    Random myRandomizer = new Random();
    var contractRepo = new SIContractRepository();
    contractRepo.GetValueAndIncrementCounterRef = GetValueAndIncrementMock;
}

public long GetValueAndIncrementMock(ref Counter counter)
{
    return Int64.Parse(myRandomizer.Next().ToString())
}
于 2011-05-04T13:55:51.443 に答える
1

現在のバージョンの Moles では、メソッドの LAST 引数として ref および out 引数のみがサポートされていることに注意してください。

http://research.microsoft.com/en-us/projects/pex/molesmanual.pdf

制限 Moles の現在の実装には、いくつかの制限があります。これらの制限はアプローチに固有のものではなく、Moles の将来のリリースで解決される可能性があります。 ポインタを含むメソッド シグネチャはサポートされていません。 スタブ型は仮想メソッドのディスパッチに依存しているため、シールされたクラスまたは静的メソッドをスタブ化することはできません。このような場合は、このドキュメントで後述する「モル タイプ」で説明されているように、モル タイプを使用します。

于 2012-05-15T08:25:58.207 に答える
0

これがほくろを適用する正しい方法であるかどうかはわかりませんが、私はそれをしました. そして、それは機能します。

///method get call in unit test
public static void DetermineSprintCorporateLiableCustomer()
{
  COptions p2 = new COptions();  
  MGetCOptions.CustomerInfoCallerOptionsRef = (ref COptions p1) =>
  {
    if (p1 != null && p1 != null && p1.Type.Equals(
      "Data", StringComparison.OrdinalIgnoreCase))
      {
        p1.Type = "P";
        p1.Indicator = true; 
      }
    p2 = p1;
  };
}

テスト実行時にこの部分が実行されると、新しい p2 が使用可能になります。以下は私のシナリオでした。

// need to unit test Coptions.Type="Data"
public static MainMethod(Coptions)
{
  Mclass.Method(ref Coptions);
  If(COptions.Type="B")
    Do something();
} 

新しい値で動作しますが、もっと良い方法があるかもしれません。

于 2012-03-22T13:52:19.463 に答える