将清单与scalatest进行比较

dav*_*ugh 5 scala scalatest

我正在使用Scala和Akka启动一个新项目,编写测试时遇到了麻烦。在测试中,我List使用should equal以下命令检查两个对象的相等性:

actualBook should equal (expectedBook)
Run Code Online (Sandbox Code Playgroud)

我的测试套件中的所有内容均可编译并运行,但是测试失败并显示以下消息:

org.scalatest.exceptions.TestFailedException: List(BookRow(A,100.0,10.6)) did not equal List(BookRow(A,100.0,10.6))
Run Code Online (Sandbox Code Playgroud)

显然,测试正在通过(即,两个List对象都包含相同的内容)。不知道这是相关与否,但actualBookexpectedBook具有相同的哈希码(和actualBook(0)expectedBook(0)也有相同的散列码)。

我想知道问题是否是由于...

  1. 我使用不正确的比较运算符
  2. 我尚未明确定义比较BookRow对象的事实。

供参考的是我的测试代码:

包lob

import cucumber.api.DataTable
import org.scalatest.Matchers._
import scala.collection.JavaConversions._
import cucumber.api.java.en.{When, Then}

class OrderBookSteps {

  val orderTypes = OrderType.all()

  val buyBook: OrderBook = new OrderBook(Bid, orderTypes)

  val sellBook: OrderBook = new OrderBook(Ask, orderTypes)

  @When("""^the following orders are added to the "(.*?)" book:$""")
  def ordersAddedToBook(sideString: String, orderTable: DataTable) {

    val (side, book) = getBook(sideString)

    val orders = orderTable.asList[OrderRow](classOf[OrderRow]).toList.map(
  r => LimitOrder(r.broker, side, r.volume, r.price.toDouble))
    orders.foreach(book.add)
  }

  @Then("""^the "(.*?)" order book looks like:$""")
  def orderBookLooksLike(sideString: String, bookTable: DataTable) {

    val (_, book) = getBook(sideString)
    val expectedBook = bookTable.asList[BookRow](classOf[BookRow]).toList
    val actualBook = book.orders().map(o => BookRow(o.broker, o.volume, orderTypes(o).bookDisplay))

    actualBook should equal (expectedBook)
  }

  def getBook(side: String) = side match {
    case "Bid" => (Bid, buyBook)
    case "Ask" => (Ask, sellBook)
  }

  case class OrderRow(broker: String, volume: Double, price: String)

  case class BookRow(broker: String, volume: Double, price: String)

}
Run Code Online (Sandbox Code Playgroud)

nit*_*gar 7

你可以试试:

List(BookRow(A,100.0,10.6)).toSeq should equal (List(BookRow(A,100.0,10.6)).toSeq)
Run Code Online (Sandbox Code Playgroud)

或者:

List(BookRow(A,100.0,10.6) should contain theSameElementsAs List(BookRow(A,100.0,10.6))
Run Code Online (Sandbox Code Playgroud)

假设你有BookRow(普通班级)等于覆盖。


dav*_*ugh 3

我找到了解决方案,尽管我不明白它为什么有效!我只需要更换:

case class OrderRow(broker: String, volume: Double, price: String)

case class BookRow(broker: String, volume: Double, price: String)
Run Code Online (Sandbox Code Playgroud)

private case class OrderRow(broker: String, volume: Double, price: String)

private case class BookRow(broker: String, volume: Double, price: String)
Run Code Online (Sandbox Code Playgroud)

我想知道为什么这有效。