我正在尝试使用RailsEventStore在源于事件/ CQRS和DDD启发的Rails 5.2.x应用程序中构建事件流的持久关系投影。
要让我的投影机收到有关新事件的通知,我正在使用Client#subscribe
,它工作得很好。我在Rails初始化程序文件中设置了我的投影仪订阅。
现在,当我运行测试时,大多数测试都不需要对事件流进行投影。因此,我只想在高度集成的测试中获得订阅。
因为我的初始化程序似乎只运行一次,所以在执行任何单独的测试之前,我需要在测试初始化中订阅/取消订阅投影机。遗憾的是,我没有发现任何Client#unsubscribe
方法的痕迹。
我已经订阅了事件流,是否可以取消订阅?还是在RailsEventStore中总体上有更好的方法来处理这种情况?
答案 0 :(得分:1)
没有Client#unsubscribe
方法。相反,每个订阅都会返回您调用的lambda以撤消订阅:
irb(main):001:0> event_store
=> #<RailsEventStore::Client:0x83ea4880>
irb(main):002:0> my_handler = ->(event) { }
=> #<Proc:0x000000010d6f1720@(irb):2 (lambda)>
irb(main):003:0> revoke = event_store.subscribe(my_handler, to: [Ordering::OrderSubmitted])
=> #<Proc:0x000000010d6d3568@/Users/pawelpacana/.rubies/ruby-2.5.5/lib/ruby/gems/2.5.0/gems/ruby_event_store-0.40.1/lib/ruby_event_store/subscriptions.rb:53 (lambda)>
irb(main):004:0> revoke.call
=> [Ordering::OrderSubmitted]
还是在RailsEventStore中总体上有更好的方法来处理这种情况?
我的同事Rafał在https://blog.arkency.com/optimizing-test-suites-when-using-rails-event-store/中描述了如何根据测试用例启用或禁用特定的订户。简而言之,想法是为每个测试创建新的event_store
实例,并基于测试元数据过滤用户列表。
每个测试都有新的event_store
实例(无需订阅者),您不再需要取消订阅。然后,您可以例如在集成测试用例中明确订阅:
def integrate_with_read_model
event_store.subscribe(::MenuOffer.method(:handle_menu_offer_chosen), to: [MenuOfferAccepted])
event_store.subscribe(::MenuOffer.method(:handle_menu_offer_rejected), to: to: [MenuOfferDeclined])
event_store.subscribe(::MenuOffer.method(:handle_menu_offer_is_pending), to: [MenuOfferIsPending])
event_store.subscribe(::MenuOffer.method(:handle_menu_offer_set), to: [MenuOfferSet])
end
before(:each) { integrate_with_read_model }