2014-12-24 1 views
1

doStuff 기능을 테스트하려면 어떻게해야합니까? (운동장 : http://play.golang.org/p/aPFSlaBLgX) 즉Deferred Go 문을 테스트하는 방법은 무엇입니까?

package myPackage 

var locked = false 

func doStuff() { 
    defer unlock() 
    lock() 
    // some task that can cause errors 
    // need to test if lock was really unlocked 
    // this is just a simple example, things can go complex on real world 
    panic("!") 
} 

func lock() { 
    locked = true 
} 

func unlock() { 
    locked = false 
} 

: 어떻게 defer 문을 사용하는 코드를 테스트? 지연 호출을 테스트하기 위해 일반적인 전략을 사용해야합니까? 일반적인 관행이없는 경우이 특정 코드를 테스트하는 방법은 무엇입니까?

PS : 놀이터는 package main

+1

어떤 목적으로? 지연된 메소드가 실행되었음을 주장하려고합니까? –

+0

예, 지연 호출에 예상되는 효과가 있음을 주장하려고합니다. 이 예제에서 예상되는 효과는 "잠금 해제 됨"을 표준 출력에 인쇄하는 것입니다. – marcio

+1

'sync.Mutex'를 테스트하려면 이미 잠금이 해제되어야 할 때 잠금을 해제해야합니다. 이 경우 가로 채기가 필요한 런타임 오류가 발생합니다. "m 잠금을 해제하면 m 잠금이 해제됩니다"http://golang.org/pkg/sync/#Mutex.Unlock에 m 항목이 잠기지 않으면 런타임 오류가 발생합니다. 테스트는 항상 지연된 함수가 프로그램을 예상 된 상태로 유지했는지 확인하는 것이므로 실제로는 일반적인 대답이 없습니다. – Intermernet

답변

0

TL 수 있습니다 이동,

DR

을 주장가 DEFFERED해야 당황한 상태를 테스트하려면

그렇게 보이는

panic 상태를 테스트하기 위해 우리가해야 defer 테스트 어설 션 :

package myPackage 

import "testing" 

func TestLock(t *testing.T) { 
    defer func(){ 
     if locked == true { 
      t.Error("Expected locked to be false but got locked =", locked) 
     } 
    }() // do assertions on panicked state ↑ 
    defer func(){ recover() }() // recover from panic ↑ 
    doStuff() // this will panic and code execution will flow up ↑ 
    // and, of course, execution will never reach below this line --- 
    // don't put assertions here 
} 

panic을 시뮬레이트 중이므로 doStuff() 아래에서 코드가 실행되지 않기 때문에 이러한 상황이 발생합니다. 따라서 어설 션이 연기되어 "패닉 범위"에있게됩니다.

+2

그 순서를 반대로하면 연기는 스택이므로 복구 전에 두 번째 함수가 호출됩니다. – LinearZoetrope

+0

좋은 캐치! 나는 일반적인 예제를 만들려고 노력했지만 내가하고있는 일은 여기서 작은 코드 스 니펫으로 표현하기가 더 복잡하고 어렵다. 내 경우에는 자물쇠가 다른 곳에서 지속되는 많은 것들에 달려 있습니다. 그러므로 bool 변수가 아니라 테스트 할 필요가 있습니다 :) – marcio

+0

어쨌든, "공황 상태를 테스트하려면 테스트를 연기해야합니다"라는 교훈이있을 수 있습니다. – marcio

관련 문제