2014-07-08 12 views
7

Bazı Go paketlerimde% 100 kod kapsamı korumaya çalışıyorum. Bu, yapı sistemindeki bir -integration derleme etiketiyle seçtiğim bazı testlerle bile, her yerde geçerli değildir, ancak nispeten yalıtılmış kitaplık paketlerim için mümkün olmalıdır.Belirsiz hatalarla uğraşırken iyi Go paket kapsamı nasıl korunur?

Yine de, hatalı hata yollarını ele alma konusunda sorun yaşıyorum.

go tool cover html output

ulaşma:

İşte
func (idx Index) LoadPost(title string) (*PostSpec, string, error) { 
    postFolder := strings.Replace(strings.ToLower(title), " ", "_", -1) 
    spec, err := idx.getSpec(postFolder) 
    if err != nil { 
      return nil, "", err 
    } 
    f, err := os.Open(path.Join(idx.blogdir, postFolder, "content.html")) 
    if err != nil { 
      return nil, "", err 
    } 
    defer f.Close() 

    b, err := ioutil.ReadAll(f) 
    if err != nil { 
      return nil, "", err 
    } 
    return spec, string(b), nil 
} 

o go tool -cover gibi görünüyor: Burada

gerçek dosya sistemi var bir entegrasyon testinin parçası benim methodss birinin bir örnektir Bu blok kolay değil. Açmaya çalıştığı dosyanın normal bir dosyadan başka bir şey olduğu özel bir test dizini oluşturmanın başka bir yolunu düşünemiyorum. Bu çok karmaşık bir şey gibi görünüyor.

Bu kendi başına bir anlaşma çok fazla değil, ama ben 97.3% kapsama doğru figür olduğunu hatırlamak zorunda olduğu anlamına gelir. Bu rakamın azaldığını görürsem, sınavlarımı kırdığım ve artık daha fazla kodun kalmadığı anlamına mı geliyor? Ya da sadece paketi sadeleştirme ve kaldırma veya ölü kod ile geliştirmeyi başardım? İkinci tahmine yol açar.

Daha da önemlisi bazı, bir iş bağlamında güzel bir yapı pano önünde bir engel var.

+1

http://golang.org/src/pkg/io/ioutil/ioutil_test.go yanı mevcut dosyaları kullanır. – VonC

+0

Teşekkürler. Ben sadece bu bağlantıyı kontrol ettiğimde ReadFile'ı keşfettim, bu yüzden şimdilik "os.Open()" ve "ioutil.ReadAll()" işlevini tek bir "ioutil.ReadFile()" ile değiştirerek sorunu çözdüm. şimdi her şey kaplıdır. Sanırım sorum yine de geçerli. – Cera

cevap

5

io/ioutil/ioutil_test.go basitçe Mevcut olmayan bir dosya ile ioutil.ReadFile() işlevini çağırarak bu hatayı sınamak yapar.

Bu, herhangi bir kurulum gerektirmemelidir.

filename := "rumpelstilzchen" 

contents, err := ReadFile(filename) 
if err == nil { 
    t.Fatalf("ReadFile %s: error expected, none found", filename) 
} 
+1

Gerçekten, ancak bu yalnızca ReadFile yardımcı programını kullanmaya başladığımda çalışır. Ioutil.ReadAll() 'ın kullanıldığı herhangi bir durum vardır - herhangi bir“ io.Reader ”ile çalışır - ve bence soru, test edilmeleri zor bir durumdur. – Cera

+0

@Cerales, ancak * herhangi bir * 'io.Reader (http://stackoverflow.com/a/24546644/6309) ile çalışıyorsa, kendi sınıfınızı test sınıfında tanımlayabilir ve bunu bilerek kullanmak için kullanabilirsiniz. 'ReadAll' testi. – VonC