Поблочное тестирование scala агенты

Нет, не по умолчанию. Откуда pandoc должен знать, что не является частью вашего кода?

Однако вы можете написать фильтр pandoc , который соответствует каждому блоку кода и преобразует его в необработанный HTML блок. Что-то вроде (не проверено):

function CodeBlock(elem)
  html = "
" .. elem.text .. "
" return pandoc.RawBlock("html", html) end

Обратите внимание, что вам нужно убедиться, что у вас нет другого неэкранированного HTML в ваших блоках кода.

Обновление

Если вам также нужна подсветка синтаксиса, возможно, вы захотите попробовать фильтр кодов пандока-подчеркивания .

12
задан Thomas 23 January 2009 в 20:44
поделиться

4 ответа

Из-за динамического характера передачи сообщений стиля агента насмешка агентов обычно не является никакой проблемой вообще. Просто создайте агента, который получает желаемое сообщение, и Вы дома свободные. Необходимо будет, конечно, удостовериться, что этот ложный агент является одним, которому передаются сообщения, но это не должно быть проблемой пока агент, которого Вы пытаетесь протестировать, повторно используемо.

5
ответ дан 2 December 2019 в 22:23
поделиться

Я думаю, что сложность зависит от пары факторов...

  1. Насколько с сохранением информации агент?

Если это ведет себя как идемпотентная функция, только асинхронная, то это должен быть простой вопрос копирования агента, который отправляет сообщение и затем проверяет, что это получает ожидаемые сообщения назад. Вы, вероятно, хотите использовать react/receiveWithin на ложном агенте в случае, если существует ответ в разумном сроке, который можно привести к сбою вместо зависания.

Однако, если сообщения не независимы друг от друга, то необходимо протестировать его с различными последовательностями сообщений и ожидаемых результатов.

  1. Со сколькими агенты будут агент, протестированный взаимодействовать?

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

Я не знаю ни о каких предварительно созданных платформах для тестирования агентов, но Вы могли возможно обратиться к Erlang для вдохновения.

http://svn.process-one.net/contribs/trunk/eunit/doc/overview-summary.html

3
ответ дан 2 December 2019 в 22:23
поделиться

Мне было интересно, как самому тестировать Актеров.

Вот что я придумал, видит ли кто-нибудь проблемы с этим подходом?

Вместо того, чтобы отправлять сообщения напрямую, что если ваш актер делегировал отправку сообщения функции?

Затем ваши тесты могут заменить функцию той, которая отслеживает количество вызовов и / или аргументов, с которыми был вызван метод:

class MyActor extends Actor {

  var sendMessage:(Actor, ContactMsg) => Unit = {
    (contactActor, msg) => {
      Log.trace("real sendMessage called")
      contactActor ! msg 
    }
  }

  var reactImpl:PartialFunction(Any, Unit) = {
      case INCOMING(otherActor1, otherActor2, args) => {

        /* logic to test */
        if(args){
          sendMessage(otherActor1, OUTGOING_1("foo"))

        } else {
          sendMessage(otherActor2, OUTGOING_2("bar"))
        }
      }
  }

  final def act = loop {
    react {
      reactImpl
    }
  }

Ваш тестовый пример может содержать такой код:

// setup the test
var myActor = new MyActor
var target1 = new MyActor
var target2 = new MyActor
var sendMessageCalls:List[(Actor, String)] = Nil

/*
* Create a fake implementation of sendMessage
* that tracks the arguments it was called with
* in the sendMessageCalls list:
*/
myActor.sendMessage = (actor, message) => {
  Log.trace("fake sendMessage called")
  message match {
    case OUTGOING_1(payload) => { 
      sendMessageCalls = (actor, payload) :: sendMessageCalls
    }
    case _ => { fail("Unexpected Message sent:"+message) }
  }
}

// run the test
myActor.start
myActor.reactImpl(Incoming(target1, target2, true))

// assert the results
assertEquals(1, sendMessageCalls.size)
val(sentActor, sentPayload) = sendMessageCalls(0)
assertSame(target1, sentActor)
assertEquals("foo", sentPayload)
// .. etc.
1
ответ дан 2 December 2019 в 22:23
поделиться

Моя попытка модульного тестирования актера (оно работает). Я использую Specs в качестве основы.

object ControllerSpec extends Specification {
  "ChatController" should{
    "add a listener and respond SendFriends" in{
        var res = false
        val a = actor{}
        val mos = {ChatController !? AddListener(a)}
        mos match{
             case SendFriends => res = true
             case _ => res = false
        }
        res must beTrue
    }

Это работает путем отправки синхронного вызова одноэлементному ChatController. ChatController отвечает, используя reply () . Ответ отправляется как возврат вызываемой функции, который сохраняется в mos. Затем сопоставление применяется к mos, получая класс дела, который был отправлен из ChatController. Если результат соответствует ожиданиям (SendFriends), установите для res значение true. Утверждение res must beTrue определяет успех или неудачу теста.

Мой одиночный объект-субъект, который я тестирую

import ldc.socialirc.model._

import scala.collection.mutable.{HashMap, HashSet}
import scala.actors.Actor
import scala.actors.Actor._

import net.liftweb.util.Helpers._

//Message types
case class AddListener(listener: Actor)
case class RemoveListener(listener: Actor)
case class SendFriends
//Data Types
case class Authority(usr: Actor, role: String)
case class Channel(channelName: String, password: String, creator: String, motd:   String, users: HashSet[Authority])

object ChatController extends Actor {
    // The Channel List  - Shows what actors are in each Chan
    val chanList = new HashMap[String, Channel]
    // The Actor List - Shows what channels its in
    val actorList = new HashMap[Actor, HashSet[String]]

    def notifyListeners = {

    }

    def act = {
        loop {
            react {
                case AddListener(listener: Actor)=>
                    actorList += listener -> new HashSet[String]
                    reply(SendFriends)

            }
        }
    }
    start //Dont forget to start
}

Несмотря на то, что он не завершен, он возвращает класс случая Sendfriends, как ожидалось.

1
ответ дан 2 December 2019 в 22:23
поделиться
Другие вопросы по тегам:

Похожие вопросы: