2013-07-07 2 views
3

에는 'string', 'string option'및 'int option'의 세 가지 속성 'a', 'b'및 'c'가있는 유형 공급자가 있습니다.형식 공급자의 이상한 동작

(row1.a, row1.b, row1.c) |> should equal ("", None, Some 1) 

을하지만이 모두 잘 작동 : 나는 ""와 인스턴스가있는 경우

, 없음, 이러한 속성 및 일부 1이 실패하지

row1.a |> should equal "" 

row1.b |> should equal None 

row1.c |> should equal (Some 1) 

("", None, Some 1) |> should equal ("", None, Some 1) 

방법이 가능하다 ? b의 None을 다른 None과 다른 것으로 만들 수있는 것은 무엇입니까? 컴파일 후, None은 단지 null이고, 두 개의 null 값은 .Net에서 다를 수 있습니까?

튜플은 대부분의 F # 유형과 마찬가지로 구조적으로 동일하므로 작동해야합니다. 나는 메시지와 함께 NUnit.Framework.AssertionException를 얻을 : 문제는 곳은 그래서

Expected: <(, , Some(1))> 
But was: <(, , Some(1))> 

NUnit를 그냥 .Equals를 호출합니다.

이 또한 실패

실제로는 튜플에는 None 없다 않습니다
row1 |> should equal ("", None, Some 1) 

그리고 때

(row1.a, row1.b, row1.c).Equals(("", None, Some 1)) |> should equal true 

row1의 실행시의 형태는 너무도이 이론에서 작동해야 System.Tuple<string,Microsoft.FSharp.Core.FSharpOption<string>,Microsoft.FSharp.Core.FSharpOption<int>>입니다 .

나는이 문제를 다른 방법으로 재현 할 수는 없지만 제공자를 입력 할 수는 없습니다.

+0

흠. 'string * string option * int option'을'string * obj option * int option'과 비교하고 있습니까? – kvb

+0

만약 내가 이렇게하면 : '(t는 행렬, 행, b, 행 1.c) |>와 같아야한다'는 툴팁에't'가'string * '옵션 * int 옵션', 그래서 그것은 작동합니다. –

+0

좋아, 나는 문제가 왼쪽에있는 대신 오른쪽에있는 것으로 가정하고 있었지만, 귀하의 의견 후 나는이 두 가지를 깨닫게 :'(row1.a, row1 ("", Option .None, Some 1)'과 같아야합니다 :'row1 |>은 같아야합니다 ("", Option .None, Some 1)'. 감사합니다 –

답변

5

우리는이 여러 번 물린, 그래서 우리는이에 a specific note을 만듭니다

FsUnit는 DSL을 구현하는 형식 시험을 사용합니다. 이 DSL에서는 형식 유추가 작동하지 않으므로 비교 된 두 값이 같은 형식에 속하는지 확인하십시오. 예를 들어

, 등등 True, False, 같은 몇 가지 일반적인 값, 당신은 자신의 유형을 지정해야합니다 그렇지 않으면이 값을 입력 obj의 것으로 비교됩니다 (formula<fol>.True, formula<fol>.False, 등 등).

how FsUnit is implemented,을 살펴보면 실제로는 형식이 안전하지 않습니다. 나는 Jack P.'s pull request이 FsUnit을보다 안전한 형태로 만드는 단계라고 믿습니다. FsUnit을 향상시키는 영역 인 것 같습니다.

+1

나는 빈 목록'[]'에 대해서도 같은 문제가있었습니다.형식 주석 ('([] : list )')이 문제를 해결했습니다. –