使用具有默认参数值的构造函数模拟受保护的类成员

时间:2013-01-09 17:55:50

标签: c# .net unit-testing moq

我知道测试非公共成员被认为是坏的,但仍然为什么这不起作用? 它会向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它会抛出此消息的Exception:找不到给定参数的匹配构造函数模拟的类型。我想这与使用默认值

的奇怪构造函数有关

2 个答案:

答案 0 :(得分:3)

您需要遵循附加设置
1.在顶部添加using Moq.Protected() 2.使用InternalsVisibleTo属性使Moq可以看到类型。     [assembly:InternalsVisibleTo(RhinoMocks.NormalName)]     [assembly:InternalsVisibleTo(RhinoMocks.StrongName)]

来自link

答案 1 :(得分:0)

我看到了什么问题...... 这样:

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

应该是:

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

签名是params object[]

但现在抛出NullReferenceException

更新:您尝试模拟的成员不仅应该是virtual而且internal'. Making them 'protected还不够。无法通过Refection.Emit()识别代理,而Moq使用/