2

次のインターフェースがあります。

interface IManufacturing
{
    IJobApi JobApi {get;}
}

interface IJobApi
{
    IList<JobSpec> GetSpecs (string wo, string name);
}

IManufacturing を使用し、次のように GetSpecs() を呼び出すクラスがあります。

var specs = _manufacturing.JobApi.GetSpecs (wo, name);

私は自分のモックを次のように設定します:

var jobApi = A.Fake<IJobApi> ();
A.CallTo (() => jobApi.GetSpecs (It.IsAny<string> (), It.IsAny<string> ()))
            .Invokes (() => System.Diagnostics.Trace.WriteLine("GetSpecs called!"))
            .Returns (new List<JobSpec>
                      {
                          new JobSpec("blablabla", "0.125", "something")
                      });

var manufacturing = A.Fake<IManufacturing> ();
A.CallTo (() => manufacturing.JobAPI)
            .Invokes (() => System.Diagnostics.Trace.WriteLine ("JobAPI called!"))
            .Returns (jobApi);

テストを実行すると、出力に「ジョブ API が呼び出されました」という文字列しか表示されません。そのため、GetSpecs() は嘲笑されず、実際に呼び出し元はスペックのリストを期待していたのに空の文字列を受け取ったためスローしました...

ここで犯人は何でしょうか?

ありがとう。

4

1 に答える 1

3

くそー!

あなたは笑うつもりです、私は持っています!

次の行が判明しました

A.CallTo (() => jobApi.GetSpecs (It.IsAny<string> (), It.IsAny<string> ()))

FakeItEasyには正しくありませんでした。それは次のように書く必要があります

A.CallTo (() => jobApi.GetSpecs (A<string>.Ignored, A<string>.Ignored))

だから、なぜそれがコンパイルされて実行されたのか不思議に思うかもしれません...ええ私もそうです。;)

It.IsAnyはMoq用です(!)

クラスのトップでUsingMoqが長引いていました。(私はmoqからfakeiteasyに切り替える過程にあります)。

【顔の手のひら】

TGIF

于 2012-07-13T18:44:18.657 に答える