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