2016-11-23 2 views
2

Я использую specs2, и я понимаю, что must и should эквивалентны (см. What is the difference between should and must in scala testing?), и использование того или другого является только личным предпочтением.Specs2 сравнение строк не работает с

Однако при сравнении строк, следующий тест с использованием must работы:

import org.specs2.mutable._ 

class StringEqualWithMust extends Specification { 

    "string comp " should { 
    "abc" must beEqualTo("abc") 
    } 
} 

Но тот же самый тест с использованием should не скомпилируется:

import org.specs2.mutable._ 

class StringEqualWithShould extends Specification { 

    "string comp " should { 
    "abc" should beEqualTo("abc") 
    } 
} 

Ошибка компиляции:

StringEqualWithShould.scala:7: overloaded method value should with alternatives: 
[error] (fs: => org.specs2.specification.core.Fragments)(implicit p1: org.specs2.control.ImplicitParameters.ImplicitParam1)org.specs2.specification.core.Fragments <and> 
[error] (f: => org.specs2.specification.core.Fragment)org.specs2.specification.core.Fragment 
[error] cannot be applied to (org.specs2.matcher.BeEqualTo) 
[error]  "abc" should beEqualTo("abc") 
[error]   ^
[error] one error found 

Почему существует разница между must и should при сравнении строк?

Я использую SBT 0.13.8, 2.12.0, Скалы и specs2 3.8.6

+0

Ожидаемая структура для изменяемого спецификации является 'should' (>' '>>)>' в' и 'must' с совпадением – cchantep

+0

Какую версию specs2 вы используете? Можете ли вы попробовать с '3.8.6'? – Eric

+0

Тот же результат с версией 3.8.6 – obourgain

ответ

0

Трудность возникает из того факта, что should может быть использован для открытия блока примеров, но и описать ожидание , Вы можете обойти это путем смешивания в следующей черты

import org.specs2.specification.core._ 
import org.specs2.control.ImplicitParameters._ 
import org.specs2.specification.dsl.mutable.ExampleDsl 

trait NoShouldBlock extends ExampleDsl { 

    override def describe(s: String) = super.describe(s) 

    implicit class block(d: String) { 
    def >>(f: => Fragment): Fragment = describe(d).>>(f) 
    def >>(fs: => Fragments)(implicit p1: ImplicitParam1): Fragments =  describe(d).>>(fs)(p1) 
    } 

} 

А потом написать спецификацию как

class StringEqualWithShould extends org.specs2.mutable.Specification with NoShouldBlock { 

    "string comp" >> { 
    "first example" >> { 
     "abc" should beEqualTo("abc") 
    } 
    "second example" >> { 
     "def" should beEqualTo("def") 
    } 
    } 
} 
Смежные вопросы