Почему scala не распознает метод из trait

#scala #scala-2.8

#scala #scala-2.8

Вопрос:

Прежде всего, у меня есть trait:

 import _root_.com.thoughtworks.selenium._
import org.scalatest.matchers.ShouldMatchers
import org.scalatest.matchers.ShouldMatchers._

trait SeleniumField extends ShouldMatchers {

  val name : String

  def selenium : Selenium

  def text : String = { return selenium.getValue(name) }

  def is(v:String) : Boolean  = { this.value equals v }

  def set(v:String) =  { selenium.`type`( name , v ) }

}
  

Затем я создаю класс scala с этим признаком:

 import _root_.com.thoughtworks.selenium._

class WebAppField(sel:Selenium, nam: String) extends SeleniumField {

  def selenium = sel

  override val name = nam
}
  

И затем, когда я пытаюсь использовать его в коде:

 val rodzaj =  new WebAppField(selenium, "RODZAJ")
rodzaj text should equal  "K"
  

я получил:

 error: not found: value should
[INFO]    rodzaj text should equal  "K"
  

Что я делаю не так?

Scala версии 2.8

Ответ №1:

Когда вы опускаете точки и круглые скобки при вызовах методов в Scala, они всегда анализируются одинаково, предполагая инфиксную нотацию и одиночные аргументы.

 rodzaj text should equal "K"
  

это то же самое, что

 rodzaj.text(should).equal("K")
  

Попробуйте переписать его как:

 rodzaj.text should equal("K")
  

или вы могли бы полностью расставить знаки препинания как:

 rodzaj.text.should(equal("K"))
  

Комментарии:

1. Конечно, последнее, rodzaj.text.should(равно(«K»)), хорошо 🙂 Я обещаю, что буду читать больше scaladoc

Ответ №2:

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

 import org.scalatest.matchers.ShouldMatchers._
  

чтобы включить это неявное в область видимости. Этого недостаточно, чтобы импорт появился в тестируемом коде.

На самом деле, довольно странно иметь какие-либо ссылки на ScalaTest вообще в тестируемом коде. Обычно ссылки на ваш тестовый фреймворк должны появляться только в ваших тестах.

Комментарии:

1. Хм, хотя это разумный совет, мне кажется, что ответ Дэвида, вероятно, является правильным объяснением фактического сообщения об ошибке, которое вы видите.