首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >FsUnit `如果相等‘在“`Some []”上失败

FsUnit `如果相等‘在“`Some []”上失败
EN

Stack Overflow用户
提问于 2014-06-02 08:02:42
回答 2查看 957关注 0票数 5

当我使用FsUnit 2.6.3运行这个NUnit测试时,

代码语言:javascript
复制
let f xs = Some (List.map ((+) 2) xs)

[<Test>]
let test() =
  f []
  |> should equal (Some [])

我得到:

代码语言:javascript
复制
Result Message: 
Expected: <Some([])>
  But was:  <Some([])>
Result StackTrace:  
at FsUnit.TopLevelOperators.should[a,a](FSharpFunc`2 f, a x, Object y)

即使消息中的预期和实际情况相同,测试仍会失败。发生了什么?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-06-02 09:21:24

原因是FsUnit在掩码下使用了非类型机制,所以类型检查器将Expected推断为object (参见堆栈跟踪中的Object y部分)。

解决方法是为泛型值添加类型注释,即

代码语言:javascript
复制
[<Test>]
let test() =
  f []
  |> should equal (Some ([]: int list))

有几个人被这个咬了,比如类型提供程序中的无异常行为

流利的断言对我来说是毫无意义的,一旦它们不再是类型安全的。我建议创建一个类型安全替代方案

代码语言:javascript
复制
let shouldEqual (x: 'a) (y: 'a) = 
    Assert.AreEqual(x, y, sprintf "Expected: %A\nActual: %A" x y)
票数 9
EN

Stack Overflow用户

发布于 2014-06-02 09:16:13

这是因为您的两个空列表是不同类型的。在测试的这个版本中,请参见actualexpected的类型:

代码语言:javascript
复制
[<Test>]
let test() =
  let expected = Some []
  let actual = f []
  actual |> should equal expected

expected'a list option,实际是int list option,所以它们是不相等的。

如果您给编译器一些有关预期结果的提示,那么它就会工作。

代码语言:javascript
复制
[<Test>]
let test() =
  f []
  |> should equal (Some List.empty<int>)
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23989847

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档