1

我有一個看起來像這樣的演員:如何對在其方法中獲取對另一個actor的引用的actor進行單元測試?

public class MyActor : Actor, IMyActor 
{ 
    public async Task<ICustomerActor> GetCustomer() 
    { 
     var customerId = await StateManager.TryGetStateAsync<ActorId>(CustomerIdState); 

     return customerId.HasValue 
      ? ActorProxy.Create<ICustomerActor>(customerId.Value) 
      : null; 
    } 
} 

我想知道是否有測試此類型的交互方式。我們使用ServiceFabric.Mocks庫來設置在正在運行的服務之外創建演員所需的所有腳手架,但是當它到達ActorProxy.Create<ICustomerActor>(customerId.Value)行時,它會引發異常,因爲沒有任何內容像真正的服務那樣真正綁定在一起。

System.ArgumentException 
Failed to determine the current application, please provide application name. 
Parameter name: applicationName 
    at Microsoft.ServiceFabric.Actors.Generator.ActorNameFormat.GetFabricServiceUri(Type actorInterfaceType, String applicationName, String serviceName) 
    at Microsoft.ServiceFabric.Actors.Client.ActorProxyFactory.CreateActorProxy[TActorInterface](ActorId actorId, String applicationName, String serviceName, String listenerName) 
    at Microsoft.ServiceFabric.Actors.Client.ActorProxy.Create[TActorInterface](ActorId actorId, String applicationName, String serviceName, String listenerName) 

回答

2

將ActorProxyFactory注入到調用的Actor構造函數中,並使用它創建ActoryProxy實例。如圖所示herehere

然後使用模擬庫創建模擬代理。像這樣:https://github.com/loekd/ServiceFabric.Mocks

+0

我想到了這一點,但希望有一個更好的解決方案。 :)我只是希望有一種方法來「修復」常規的'ActorProxy.Create'方法。 – moswald

+0

要清楚,這不是一個壞的方法,但所有的文檔都說「要獲得一個actor參考,請調用ActorProxy.Create'」。這會改變這一點,現在有兩種方法可以做同樣的事情。當圖書館作者不考慮他們的靜態和/或擴展方法如何影響需要編寫測試的應用程序作者時,我總是很煩惱。 :/ – moswald

+0

我更喜歡這種方法,但也有來自Fakes框架的Shims。 – LoekD

相關問題