在编写依赖于当前日期/时间的集成测试时,能够RelativeLayout commentsView = (RelativeLayout)findViewById(R.id.commentsView);
RelativeLayout.LayoutParams params = (RelativeLayout.LayoutParams)commentsView.getLayoutParams();
params.addRule(RelativeLayout.BELOW, R.id.postArea);
commentsView.requestLayout();
或freeze
到特定时刻(例如,timecop对于ruby)非常方便< / p>
有没有办法在Elixir / Erlang中实现类似的东西?
我尝试使用travel
库来模拟Erlang内置插件:os.timestamp
,:erlang.universaltime
,但它失败了meck
。
原则上我可以实现自己的实用程序库,而不是简单地模拟当前时间,然后在任何地方使用它而不是内置方法;但是,有些库使用内置函数,因此这不是一个可行的选项(例如:cannot_mock_builtin
,生成Ecto.Model.Timestamps
和inserted_at
值)
答案 0 :(得分:6)
我建议你通过依赖注入实现这个。例如(在Erlang 18中使用新的时间API):
defmodule Thing do
def do_stuff(data), do: do_stuff(data, &:erlang.system_time/0)
def do_stuff(data, time), do: {data, time.()}
end
在测试中,您可以轻松替换时间码:
defmodule ThingTest do
use ExUnit.Case
test "the time" do
assert do_stuff("data", fn -> 123 end) == {"data", 123}
end
end
以下是在Erlang中执行此操作的相应方法:
-module(thing).
-export([do_stuff/1, do_stuff/2]).
do_stuff(Data) -> do_stuff(Data, fun erlang:system_time/0).
do_stuff(Data, Time) -> {Data, Time()}.
测试:
-module(thing_tests).
-include_lib("eunit/include/eunit.hrl").
do_stuff_test() ->
?assertEqual({"data", 123}, do_stuff("data", fun() -> 123 end).