3

除了 0 或 1(从不,一次)之外,Mock.Expect我发现的所有示例都没有使用。Times我修改了 Foq.Usage.fsx 中的一个现有测试,以尝试不是 0 或 1 的东西,但我无法让它工作。

有人看到有什么不对吗?

let [<Test>] ``expect method is called the specified number of times`` () =
    // Arrange
    let xs = Mock.Of<System.Collections.Generic.IList<int>>()
    // Assert (setup)
    Mock.Expect(<@ xs.Contains(0) @>, never)
    Mock.Expect(<@ xs.Contains(1) @>, once)
    Mock.Expect(<@ xs.Contains(2) @>, exactly 2)
    // Act
    xs.Contains(1) |> ignore
    xs.Contains(2) |> ignore
    xs.Contains(2) |> ignore
    // Assert
    verifyAll xs
4

3 回答 3

3

这是Foq中的一个错误,当您使用Mock.Expect它时,会检查在模拟调用时是否满足期望。如果未满足给定的期望,则会引发异常。这在理论上可能很有用,因为它在未满足期望的确切点给出了堆栈跟踪。

问题exactly 2是在一次调用后首先检查期望,而不是两次。实际上,在调用时,我们希望exactly 2最多解释为两个,并且verifyAll恰好是两个。

Mock.Expect在效果之后,您可以使用withatmost 2和/或普通的旧验证更接近我认为您想要的行为:

let [<Test>] ``expect method is called the specified number of times`` () =
    // Arrange
    let xs = Mock.Of<System.Collections.Generic.IList<int>>()
    // Assert (setup)
    Mock.Expect(<@ xs.Contains(0) @>, never)
    Mock.Expect(<@ xs.Contains(1) @>, once)
    Mock.Expect(<@ xs.Contains(2) @>, atmost 2)
    // Act
    xs.Contains(1) |> ignore
    xs.Contains(2) |> ignore
    xs.Contains(2) |> ignore
    // Assert
    Mock.Verify(<@ xs.Contains(2) @>, exactly 2)
    verifyAll xs

感谢您报告问题。该问题现已在源代码中修复,并将在下一个版本中提供。

于 2014-01-29T03:43:31.217 回答
1

正如评论中所讨论的,这并不能回答你的问题,但是......我会写这个(有效):

let xs = Mock.Of<System.Collections.Generic.IList<_>>()
// Act
xs.Contains(1) |> ignore
xs.Contains(2) |> ignore
xs.Contains(2) |> ignore
// Assert
verify <@ xs.Contains(0) @> never
verify <@ xs.Contains(1) @> once
verify <@ xs.Contains(2) @> <| exactly 2
于 2014-01-29T00:11:40.770 回答
1

谢谢你,鲁本。我同意,明确verify的 s 是最好的,但是(也根据您的建议)下面的代码可以在任何人想要使用Expect/的情况下工作verifyAll

let [<Test>] ``expect method is called the specified number of times`` () =
    // Arrange
    let xs = Mock.Of<System.Collections.Generic.IList<int>>()
    // Act
    xs.Contains(1) |> ignore
    xs.Contains(2) |> ignore
    xs.Contains(2) |> ignore
    // Assert
    Mock.Expect(<@ xs.Contains(0) @>, never)
    Mock.Expect(<@ xs.Contains(1) @>, once)
    Mock.Expect(<@ xs.Contains(2) @>, exactly 2)
    verifyAll xs
于 2014-01-29T00:22:54.203 回答