我开始为州的新演员编写单元测试。状态在OnActivateAsync方法中初始化,该方法在激活Actor时由Service Fabric调用。
进行单元测试时,我自己创建了Actor,并且由于方法受到保护,我无法通过单元测试访问自己调用此方法。
我想知道这种测试的常用方法。我可以模拟Actor并模拟状态,但是我想测试的代码调用原始的。我想知道是否还有其他方法我没有遇到过。
另一种方法是将State初始化移动到其他地方,如公共方法或构造函数,但Actor的模板有代码,因此它可能是最佳实践。
答案 0 :(得分:4)
使用最新版本的ServiceFabric.Mocks NuGet包。它包含用于调用OnActivateAsync保护方法的特殊扩展以及用于ServiceFabric单元测试的整个工具集。
var svc = MockActorServiceFactory.CreateActorServiceForActor<MyActor>();
var actor = svc.Activate(new ActorId(Guid.NewGuid()));
actor.InvokeOnActivateAsync().Wait();
答案 1 :(得分:2)
我喜欢在actor上使用InternalsVisibleTo属性和内部方法,它调用OnActivateAsync方法。
在目标Actor项目中,AssemblyInfo.cs添加如下所示的行:
[assembly: InternalsVisibleTo("MyActor.Test")]
Where&#34; MyActor.Test&#34;是您要授予内部成员访问权限的测试项目的名称。
在目标Actor类中添加如下所示的方法:
internal Task InvokeOnActivateAsync()
{
return OnActivateAsync();
}
这样您就可以从测试项目中调用OnActivateAsync方法,如下所示:
var actor = CreateNewActor(id);
actor.InvokeOnActivateAsync()
答案 2 :(得分:1)
我很欣赏这不太理想,但您可以使用反射来调用OnActivateAsync()
方法。
例如,
var method = typeof(ActorBase).GetMethod("OnActivateAsync", BindingFlags.Instance | BindingFlags.NonPublic);
await (Task)method.Invoke(actor, null);
通过这种方式,您将测试要测试的实际方法,也不会公开您不想公开的方法。
您可能会发现在单个方法中将actor的创建和手动调用分组到OnActivateAsync()
非常有用,这样它就可以在整个测试套件中使用,并且模仿原始的Service Fabric行为。