我不能只通过调用它的构造函数然后测试它的方法来测试一个可靠的Service/Actor。var testService = new SomeService();抛出一个NullReferenceException。那么我能用部署的服务做什么呢..。
我知道已部署的SF可靠服务/执行器不是标准的.NET类,对已部署的S/A进行单元测试可能是一个奇怪的想法。
不管怎样,现在我正试着试一试。
例如。我刚刚部署了一个服务,而不是在测试中创建了一个代理对象,并将项添加到服务的输入队列中。然后我需要断言输入队列计数= 1,如果我刚刚部署了一个服务,而没有其他客户机/服务/Actors使用它的输入队列,它就能工作。但是下一次这个测试将失败,这就是问题所在。我需要让服务停止与其他消费者的操作,丢弃它的队列,而不是测试它。为此,我可以创建一些TestMode属性和一些方法,如PropareoForTest/TestingCompleted,并在测试前后从测试客户端调用它们。
这样做是个坏主意。也许对SF的单元测试有一些指导方针吗?谢谢。
更新:
在研究Service Fabric Web Reference Application example时,我发现了这个TODO字符串:
/// TODO: Temporary property-injection for an IServiceProxyWrapper until constructor injection is available.这是否意味着SF服务将改进其DI支持?演员呢?
发布于 2015-11-20 23:48:44
实际上,您可以像在.NET中测试任何其他类一样测试可靠服务和Actors!它们的特殊之处在于,它们在底层平台中使用某些钩子,但除此之外,您还可以正常实例化服务或参与者类并在其上调用方法。
目前,可靠服务更容易进行单元测试,因为进入平台的主要钩子状态管理器( State )是一个可通过构造函数插入的接口。
例如,您的服务类可能如下所示:
编辑:使用GA发布API更新(2.0.135)
class MyService : StatefulService
{
public MyService (StatefulServiceContext context, IReliableStateManager stateManager)
:base (context, stateManager)
{
}
public void MyMethod()
{
// do stuff..
}
}然后您可以像这样测试您的服务类:
[TestMethod]
public TestMyMethod()
{
MockReliableStateManager stateManager = new MockReliableStateManager();
MyService target = new MyService(stateManager);
target.MyMethod();
// validate results and all that good stuff
}我们有一个完整的实际服务示例,在GitHub:https://github.com/Azure-Samples/service-fabric-dotnet-management-party-cluster上对大量依赖项进行单元测试。
这个例子还有IReliableStateManager和IReliableDictionary模拟,您可以使用它们作为单元测试的起点。
https://stackoverflow.com/questions/33725455
复制相似问题