我想在DynamoDB项目中拥有基本上是封顶的列表.我希望能够将一个项目添加到列表的前面,然后如果超过一定大小则将项目从后面放下.
在我的例子中,我将帽设置为3,前置元素"6",并在状态之前/之后显示:
{ } -> { "myList": [6] }
{ "myList": [1] } -> { "myList": [6, 1] }
{ "myList": [3, 2, 1] } -> { "myList": [6, 3, 2] }
Run Code Online (Sandbox Code Playgroud)
但我不能使用以下更新表达式来组合SET和REMOVE操作myList:
# (":empty" set to an empty list in the value map)
SET myList = list_append(:v, if_not_exists(myList, :empty)) REMOVE myList[3]
Run Code Online (Sandbox Code Playgroud)
尝试使用此表达式会导致异常(使用Java中的Document API):
Invalid UpdateExpression: Two document paths overlap with each other; must remove or rewrite one of these paths
Run Code Online (Sandbox Code Playgroud)
如果我拆分SET并 …
我有一个情况出现并咬我几次我正在测试一个Actor并且Actor意外地抛出一个异常(由于一个bug),但测试仍然通过.现在大多数情况下,Actor中的异常意味着无论测试验证是否都不正确,因此测试失败,但在极少数情况下这不是真的.异常发生在与测试运行器不同的线程中,因此测试运行器对此一无所知.
一个例子是当我使用mock来验证一些依赖项被调用时,由于Actor代码中的错误,我在mock中调用了一个意外的方法.这导致模拟抛出一个异常,炸毁了演员而不是测试.有时这甚至可能导致下游测试因为Actor如何爆炸而神秘地失败.例如:
// using scala 2.10, akka 2.1.1, scalatest 1.9.1, easymock 3.1
// (FunSpec and TestKit)
class SomeAPI {
def foo(x: String) = println(x)
def bar(y: String) = println(y)
}
class SomeActor(someApi: SomeAPI) extends Actor {
def receive = {
case x:String =>
someApi.foo(x)
someApi.bar(x)
}
}
describe("problem example") {
it("calls foo only when it receives a message") {
val mockAPI = mock[SomeAPI]
val ref = TestActorRef(new SomeActor(mockAPI))
expecting {
mockAPI.foo("Hi").once()
}
whenExecuting(mockAPI) {
ref.tell("Hi", testActor)
}
} …Run Code Online (Sandbox Code Playgroud) 我有一个使用链式部分函数处理Web服务请求的模式(我认为这是一个责任链模式?).在我的例子中,假设请求有两个参数,一个字符串Id和一个日期.有一个涉及id的验证步骤,一个检查日期的验证步骤,以及最后使用两者的一些业务逻辑.所以我实现了它们:
object Controller {
val OK = 200
val BAD_REQUEST = 400
type ResponseGenerator = PartialFunction[(String, DateTime), (String, Int)]
val errorIfInvalidId:ResponseGenerator = {
case (id, _) if (id == "invalid") => ("Error, Invalid ID!", BAD_REQUEST)
}
val errorIfFutureDate:ResponseGenerator = {
case (_, date) if (date.isAfter(DateTime.now)) => ("Error, date in future!", BAD_REQUEST)
}
val businessLogic:ResponseGenerator = {
case (id, date) => {
// ... do stuff
("Success!", OK)
}
}
def handleRequest(id:String, date:DateTime) = {
val chained = errorIfInvalidId orElse errorIfFutureDate …Run Code Online (Sandbox Code Playgroud)