2012-12-12 2 views
6

F #에서 NUnit 테스트를 작성하고 함수를 ThrowsConstraint에 전달하는 데 문제가 있습니다. 증류 된 (비) 작동 시료가 아래에 있습니다.함수를 NUnit Throws Constraint에 전달하는 방법은 무엇입니까?

open System.IO 
open NUnit.Framework 

[<TestFixture>] 
module Example = 

    [<Test>] 
    let foo() = 
     let f = fun() -> File.GetAttributes("non-existing.file") 
     Assert.That(f, Throws.TypeOf<FileNotFoundException>()) 

이 잘 컴파일하지만하여 NUnit과 테스트 러너에서 다음을 얻을 :

FsTest.Tests.Example.foo: 
System.ArgumentException : The actual value must be a TestDelegate but was [email protected] 
Parameter name: actual 

내가 ExpectedException 속성을 사용하여 문제를 해결 할 수있어하지만, 내 질문은 올바른 것입니다 이 상황에서 F # 함수를 사용하는 방법?

답변

7

오리지널 코드 조각이 작동하려면 (unit -> unit)의 서명을 사용하여 f을 고정해야합니다. 그냥 File.GetAttributes의 반환 값을 폐기 : 또 다른 피팅 NUnit과는 Assert.That(actual: obj, expression: Constraints.IResolveConstraint)이 존재 과부하 때문에

let f = fun() -> File.GetAttributes("non-existing.file") |> ignore 

F # 컴파일러는 원래 코드를 발프하지 않았다. Assert.That으로

내가 예를 들어 예상 예외보다 구체적인 어설 양식을 테스트하기위한 다루고 싶어요 매우 광범위한 사용을 가지고 : F # 컴파일러가 정적 함수의 잘못된 서명을 더럽힐 수있을 것

[<Test>] 
let foo() = 
    Assert.Throws<FileNotFoundException> 
     (fun() -> File.GetAttributes("non-existing.file")|> ignore) 
    |> ignore 

.

+0

설명해 주셔서 감사합니다. –

+0

F # (VS 2010) 속성 접근 방식이 나를 위해 작동하지 않기 때문에 좋은 해결책입니다 (ExpectedException 특성을 가진 테스트 메서드를 표시하려고 시도했지만 전혀 작동하지 않았습니다) 감사! – Roboblob

4

IMHO, NUnit 위에 Unquote을 사용하면 약간의 고통을 덜 수 있습니다. 그런 다음 주장은 때때로 예기치 않은 런타임 동작이 F 번호에 비해 표현의 C#의 상대적 부족을 보상하기 위해 설계와 주장 과부하의 간단

[<Test>] 
let foo() = 
    raises<FileNotFoundException> <@ File.GetAttributes("non-existing.file") @> 

로 NUnit과의 넓은 스위트 룸 것이다. F 번호가 이미 우아하게 표현하는 주장에 대한 구조 비교 등의 기능이 탑재되어 있기 때문에

는 온 - 더 - 다른 손, 인용을 끝내는 세 개의 단순한 주장 사업자와의 기본 기능을 활용하도록 설계되었습니다 test, raisesraisesWith.

+0

+1은 Unquote를 언급합니다. –

+0

unquote가 내가 시도한 첫 번째 것이기 때문에 그것은 매우 흥미 롭습니다. 불행히도 NUnit과 unquote의 조합은 나를 위해 잘 작동하지 않았으므로 NUnit이 다시 주장했습니다. 내가 NUnit과 함께했던 문제를 요약하고 unquote 및 [다른 질문] (http://stackoverflow.com/questions/13846561/missingmethodexception-when-using-unquote-asserts)로 게시, 그 도움이 될 것이라고 감사하겠습니다. –

+0

죄송합니다 @ SergeBelov, 불행합니다! 새 질문에 덧글을 달았습니다. 내가 가진 문제는 Unquote 그 자체가 아니라, NUnit 테스트 러너 어셈블리 로딩/컨피규레이션이나 그 라인을 따르는 문제라고 생각합니다. –

관련 문제