我正在尝试模拟mongo集合的集群状态,因此它返回 ClusterState.Connected 。下面你将看到我的一个单元测试。目前这是回复错误,有没有办法模拟 Collection.Database.Client.Cluster.Description.State ?
[Fact]
public void HealthCheck_SucceededDatabase_Connection()
{
//Arrange
var myRepository = new Mock<IRepository<RepoEntityObject>>();
var healthCheck = new HealthCheck(myRepository.Object);
//Setup
myRepository.Setup(mcr => mcr.Collection.Database.Client.Cluster.Description.State).Returns(ClusterState.Connected);
//Act
var result = healthCheck.ExecuteHealthchecks();
//Results
result[0].CheckType.ShouldBe("Service is alive");
result[0].Message.ShouldBe("");
result[0].Passed.ShouldBe(true);
result[1].CheckType.ShouldBe("MongoDB");
result[1].Message.ShouldBe("Service is alive");
result[1].Passed.ShouldBe(True);
}
错误堆栈跟踪:
发生System.NotSupportedException HResult = 0x80131515
消息=非虚拟(在VB中可覆盖)成员上的无效设置:mcr =&GT; mcr.Collection.Database.Client.Cluster.Description.State Source = StackTrace:at Moq.Mock.ThrowIfSetupExpressionInvolvesUnsupportedMember(表达式 设置,MethodInfo方法)at Moq.Mock。&lt;&gt; c__DisplayClass62_0`2.b__0()at Test.Unit.HealthCheckTests.HealthCheck_SucceededDatabase_Connection() 在 C:\ HealthCheckTests.cs:行 50
编辑一个可能的解决方案:
将Description.State属性设为虚拟不是我想要实现的,因为这个方法来自我正在使用的MongoDb C#驱动程序,我不打算覆盖它。
答案 0 :(得分:2)
这是关键词Invalid setup on a non-virtual member
。设置属性virtual
。否则如果因为你不能控制所述属性而无法封装所需的属性并将其暴露为虚拟
public interface IRepository<T> {
ClusterState State { get; }
//...other members removed for brevity
}
现在您可以模拟您控制的成员
//Arrange
var myRepository = new Mock<IRepository<RepoEntityObject>>();
var healthCheck = new HealthCheck(myRepository.Object);
//Setup
myRepository.Setup(mcr => mcr.State).Returns(ClusterState.Connected);
//...code removed for brevity
现在有了这样说,你现在已经意识到你的存储库正在泄漏难以单独模拟的实现问题。考虑检查有关抽象级别的设计选择。