2012-06-07 24 views
7

Tôi đang cố gắng kiểm tra một số công cụ phụ thuộc db với specs2 trong scala. Mục đích là để thử nghiệm cho "chạy db" và sau đó thực hiện kiểm tra. Tôi đã tìm ra rằng tôi có thể sử dụng orSkip từ lớp Matcher nếu db bị hỏng.Làm cách nào để bỏ qua thử nghiệm trong thông số kỹ thuật 2 mà không có đối sánh?

Vấn đề là, tôi đang nhận được đầu ra cho một điều kiện phù hợp (như PASSED) và ví dụ được đánh dấu là SKIPPED. Những gì tôi muốn thay vào đó: Chỉ thực hiện một thử nghiệm được đánh dấu là "SKIPPED" trong trường hợp kiểm thử db đang ngoại tuyến. Và đây là mã cho "TestKit" tôi

package net.mycode.testkit 

import org.specs2.mutable._ 
import net.mycode.{DB} 


trait MyTestKit { 

    this: SpecificationWithJUnit => 

    def debug = false 

    // Before example 
    step { 
    // Do something before 
    } 

    // Skip the example if DB is offline 
    def checkDbIsRunning = DB.isRunning() must be_==(true).orSkip 

    // After example 
    step { 
    // Do something after spec 
    } 
} 

Và đây mã cho spec của tôi:

package net.mycode 

import org.specs2.mutable._ 
import net.mycode.testkit.{TestKit} 
import org.junit.runner.RunWith 
import org.specs2.runner.JUnitRunner 

@RunWith(classOf[JUnitRunner]) 
class MyClassSpec extends SpecificationWithJUnit with TestKit with Logging { 

    "MyClass" should { 
    "do something" in { 
     val sut = new MyClass() 
     sut.doIt must_== "OK" 
    } 

    "do something with db" in { 
    checkDbIsRunning 

    // Check only if db is running, SKIP id not 
    } 
} 

Out bây giờ:

Test MyClass should::do something(net.mycode.MyClassSpec) PASSED 
Test MyClass should::do something with db(net.mycode.MyClassSpec) SKIPPED 
Test MyClass should::do something with db(net.mycode.MyClassSpec) PASSED 

và đầu ra tôi muốn nó được:

Test MyClass should::do something(net.mycode.MyClassSpec) PASSED 
Test MyClass should::do something with db(net.mycode.MyClassSpec) SKIPPED 
+1

Bạn có thể đưa ra ví dụ về đầu ra của bảng điều khiển hiện tại và kết quả mong muốn của bạn không? – Eric

+0

Nhập các mẫu đầu ra – Alebon

Trả lời

6

Tôi nghĩ rằng bạn có thể sử dụng một điều kiện đơn giản để làm những gì bạn muốn:

class MyClassSpec extends SpecificationWithJUnit with TestKit with Logging { 

    "MyClass" should { 
    "do something" in { 
     val sut = new MyClass() 
     sut.doIt must_== "OK" 
    } 
    if (DB.isRunning) { 
     // add examples here 
     "do something with db" in { ok } 
    } else skipped("db is not running") 
    } 
} 
+0

Nó không hoàn hảo chút nào nhưng rất hữu ích;) – Alebon

+0

@Eric Điều này ném ngoại lệ - Ngoại lệ không bắt buộc khi chạy test.functionality.Login: org.specs2.execute.SkipException. Có cách nào mà điều này sẽ không ném ngoại lệ? – 0fnt

+1

Tôi nghĩ rằng "db không chạy" trong bỏ qua' thay vào đó sẽ hoạt động. – Eric

5

Bạn đã thử sử dụng args(skipAll=true) đối số? Xem few examples here.

Thật không may (theo như tôi biết), bạn không thể bỏ qua một ví dụ duy nhất trong thông số kỹ thuật đơn vị. Bạn có thể, tuy nhiên, bỏ qua cấu trúc đặc điểm kỹ thuật với lập luận này như thế này, vì vậy bạn có thể phải tạo thông số kỹ thuật riêng biệt:

class MyClassSpec extends SpecificationWithJUnit { 

    args(skipAll = false) 

    "MyClass" should { 
    "do something" in { 
     success 
    } 

    "do something with db" in { 
     success 
    } 
    } 
} 
+0

btw bạn không cần @RunWith khi kế thừa từ WithJUnit – OlegYch

+0

Đúng vậy, hãy sửa lỗi đó. BTW Tôi đang làm việc về [Tích hợp IDE Scala của Specs2 trong GSoC 2012] (http://xcafebabe.blogspot.hu/2012/06/first-thoughts-on-scala.html), hy vọng chúng ta sẽ có thể chạy nó mà không có bất kỳ chú thích nào vào cuối mùa hè :-) – rlegendi

+3

Có một phím tắt chuyên dụng, ['skipAllIf'] (http://etorreborre.github.com/specs2/guide/org.specs2.guide.Structure.html # Bỏ qua + ví dụ) để bỏ qua tất cả các ví dụ nếu điều kiện được thỏa mãn. Phương pháp này là ngắn hơn và sẽ bắt ngoại lệ nếu biểu thức boolean của bạn xảy ra để ném bất kỳ. – Eric

Các vấn đề liên quan