如何使用State对Service Fabric Actor进行单元测试

时间:2016-02-21 13:14:11

标签: unit-testing azure-service-fabric

我开始为州的新演员编写单元测试。状态在OnActivateAsync方法中初始化,该方法在激活Actor时由Service Fabric调用。

进行单元测试时,我自己创建了Actor,并且由于方法受到保护,我无法通过单元测试访问自己调用此方法。

我想知道这种测试的常用方法。我可以模拟Actor并模拟状态,但是我想测试的代码调用原始的。我想知道是否还有其他方法我没有遇到过。

另一种方法是将State初始化移动到其他地方,如公共方法或构造函数,但Actor的模板有代码,因此它可能是最佳实践。

3 个答案:

答案 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行为。