1

非公開メンバーのテストが悪いと見なされることは知っていますが、それでも機能しないのはなぜですか? メッセージとともにスローArgumentExceptionされます: メンバーConnectが存在しません

public class FtpHelper : IFtpHelper
{
   public FtpHelper(ISignalRLogger signalRLogger, IDirectoryWrap directoryWrap = null) {
    ... some code
   }

   protected virtual IFtpClient Connect(string ftpPath) {
     ... some code
   }
}

public class TestFtpHelper
{
   [Fact]
   public void Calls_connect(){

      var signalrMq = new Mock<ISignalRLogger>();
      var clientMq = new Mock<FtpHelper>(
            MockBehavior.Strict, new { signalRLogger = signalrMq.Object });

      clientMq.Protected().Setup<IFtpClient>("Connect",new { ftpPath = ""})
    .Returns(It.IsAny<IFtpClient>()); // That doesn't work

   }
}

UPD:ああ、初期化の最後の行の前でさえ、それclientMqを使用しようとするclientMq.Objectと、このメッセージで例外がスローされることに気付きました:指定された引数の一致するコンストラクターがモックされた型で見つかりませんでした。デフォルト値を持つその奇妙なコンストラクターと関係があると思います

4

2 に答える 2

3

次の追加セットアップが必要です
。 1.using Moq.Protected()上部に追加
InternalsVisibleToます。[アセンブリ: InternalsVisibleTo(RhinoMocks.NormalName)] [アセンブリ: InternalsVisibleTo(RhinoMocks.StrongName)]

リンクから

于 2013-01-09T18:04:03.000 に答える
0

何が悪いのかわかります...
これ:

var clientMq = new Mock<FtpHelper>(
            MockBehavior.Strict, new { signalRLogger = signalrMq.Object });

する必要があります:

var clientMq = new Mock<FtpHelper>(
            MockBehavior.Strict, signalrMq.Object);

署名はparams object[]

しかし今それは投げますNullReferenceException

Upd:モックしようとしているメンバーは、そうであるだけでvirtualなく、internal'. Making them 'protected単に十分ではないはずです。プロキシを特定することはできずRefection.Emit()、Moqはそれを使用します/

于 2013-01-09T18:22:51.410 に答える