gpt4 book ai didi

c# - 为什么这个模拟不起作用,但它验证了?

转载 作者:太空宇宙 更新时间:2023-11-03 13:28:08 27 4
gpt4 key购买 nike

我定义了以下模拟(使用 Moq )。

mockSqlConnection.Setup(x => x.Query<Address>(
It.IsAny<string>(),
null,
null,
true,
null,
null))
.Returns(new List<Address>
{
new Address()
});

和以下验证

mockSqlConnection.Verify(x => x.Query<Address>(
It.IsAny<string>(),
null,
null,
true,
null,
null), Times.Once);

这两个都通过了!太棒了!

然后我有这段代码可以进行实际调用..

var result = sqlConnection.Query<Address>(.....);

然后返回 NULL

我不明白为什么总是返回 null,当我在设置中定义时,返回一个包含其中一项的列表。

更新 1:

这在我试运行我的测试时有效。但是当我 Test-DebugRun .. 这是所有这些错误发生的地方! :(

更新 2:

如果我强制 Moq 出错(即使用不正确的验证数量::我期望一次,所以我会说 Never .. 这就是我对 args 进行硬编码时所说的 .. 或使用 It.IsAny<T> 的..

Moq.MockException
Expected invocation on the mock should never have been performed, but was 1 times: x => x.Query<Address>(It.IsAny<String>(), null, null, True, null, null)

Configured setups:
x => x.Query<Address>(It.IsAny<String>(), null, null, True, null, null), Times.Once

Performed invocations:
IDbExecutor.Open()
IDbExecutor.Query(" -- code snipped --", null, null, True, null, null)
IDbExecutor.Close()
IDisposable.Dispose()

Moq.MockException
Expected invocation on the mock should never have been performed, but was 1 times: x => x.Query<Address>(It.IsAny<String>(), It.IsAny<Object>(), It.IsAny<IDbTransaction>(), It.IsAny<Boolean>(), It.IsAny<Nullable`1>(), It.IsAny<Nullable`1>())

Configured setups:
x => x.Query<Address>(It.IsAny<String>(), null, null, True, null, null), Times.Never
x => x.Query<Address>(It.IsAny<String>(), It.IsAny<Object>(), It.IsAny<IDbTransaction>(), It.IsAny<Boolean>(), It.IsAny<Nullable`1>(), It.IsAny<Nullable`1>()), Times.Once

Performed invocations:
IDbExecutor.Open()
IDbExecutor.Query(" -- sql query snipped --", null, null, True, null, null)
IDbExecutor.Close()
IDisposable.Dispose()

我不明白:(

最佳答案

原因是因为一些参数是硬编码的。如果你想要 new Address()无论参数如何都返回,试试这个:

参数为 It.IsAny<T>()允许任何值。如果参数是特定值,则 Setup 将需要该特定值按照您的定义行事。

mockSqlConnection.Setup(x => x.Query<Address>(
It.IsAny<string>(),
It.IsAny<TheType>(),
It.IsAny<TheType>(),
It.IsAny<bool>(),
It.IsAny<TheType>(),
It.IsAny<TheType>()))
.Returns(new List<Address>
{
new Address()
});

你的 Verify还需要使用 It.IsAny<T>()为了正确通过:

mockSqlConnection.Verify(x => x.Query<Address>(
It.IsAny<string>(),
It.IsAny<TheType>(),
It.IsAny<TheType>(),
It.IsAny<bool>(),
It.IsAny<TheType>(),
It.IsAny<TheType>(), Times.Once);

关于c# - 为什么这个模拟不起作用,但它验证了?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21595434/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com