2017-09-14 2 views
0

J'ai le contrôleur ci-dessous qui communique via NServiceBus IEndpointInstance (solution de réponse/requête full duplex). Je voudrais tester la validation placée dans ce contrôleur, donc j'ai besoin de passer par un objet IEndpointInstance. Malheureusement, il n'y a aucune mention à ce sujet dans la documentation du site de Particular que j'ai pu trouver.Comment faire pour simuler IEndpointInstance de NServiceBus

Dans le package nuget NServiceBus.Testing, j'ai trouvé la classe TestableEndpointInstance, mais je ne sais pas comment l'utiliser.

J'ai le code de test ci-dessous et il compile, mais il se bloque juste quand je l'exécute. Je pense que quelque chose ne va pas autour du paramétrage de TestableEndpointInstance.

Quelqu'un pourrait m'aider avec un exemple?

Controller:

public CountryController(
    IEndpointInstance endpointInstance, 
    IMasterDataContractsValidator masterDataContractsValidator) 
{ 
    this.endpointInstance = endpointInstance; 
    this._masterDataContractsValidator = masterDataContractsValidator; 
} 

[HttpPost] 
[Route("Add")] 
public async Task<HttpResponseMessage> Add([FromBody] CountryContract countryContract) 
{ 
    try 
    { 
     CountryRequest countryRequest = new CountryRequest(); 
     this._masterDataContractsValidator.CountryContractValidator.ValidateWithoutIdAndThrow(countryContract); 

     countryRequest.Operation = CountryOperations.Add; 
     countryRequest.CountryContracts.Add(countryContract); 

     // nservicebus communication towards endpoint 

     return message; 
    } 
    catch (Exception e) 
    { 
     var message = this.Request.CreateErrorResponse(HttpStatusCode.BadRequest, e.Message); 
     return message; 
    } 
} 

test:

public CountryControllerTests() 
{ 
    TestableEndpointInstance endpointInstance = new TestableEndpointInstance(); 
    // Validator instantiation 
    this.countryController = new CountryController(endpointInstance, masterDataContractsValidator); 
} 


[Theory] 
[MemberData("CountryControllerTestsAddValidation")] 
public async void CountryControllerTests_Add_Validation(
    int testId, 
    CountryContract countryContract) 
{ 
    // Given 

    // When 
    Func<Task> action = async() => await this.countryController.Add(countryContract); 

    // Then 
    action.ShouldThrow<Exception>(); 
} 
+2

Pourquoi ne pas utiliser un cadre moqueur, comme Moq ou FakeItEasy pour créer une maquette IEndpointInstance – Alex

+1

L'exemple fourni est incomplet. Fournissez un [mcve] qui peut être utilisé pour représenter le problème. Vous devez également être clair sur ce que vous essayez d'atteindre. Est-ce que cela doit être un test unitaire ou un test d'intégration? – Nkosi

+0

@Alex: Bonnes questions. Je ne suis pas venu dans ma tête. Laisse moi essayer. – SayusiAndo

Répondre

1

I ajouté Doco pour IEndpointInstance https://docs.particular.net/samples/unit-testing/#testing-iendpointinstance-usage

Étant donné un contrôleur

public class MyController 
{ 
    IEndpointInstance endpointInstance; 

    public MyController(IEndpointInstance endpointInstance) 
    { 
     this.endpointInstance = endpointInstance; 
    } 

    public Task HandleRequest() 
    { 
     return endpointInstance.Send(new MyMessage()); 
    } 
} 

Contrôlable avec

[Test] 
public async Task ShouldSendMessage() 
{ 
    var endpointInstance = new TestableEndpointInstance(); 
    var handler = new MyController(endpointInstance); 

    await handler.HandleRequest() 
     .ConfigureAwait(false); 

    var sentMessages = endpointInstance.SentMessages; 
    Assert.AreEqual(1, sentMessages.Length); 
    Assert.IsInstanceOf<MyMessage>(sentMessages[0].Message); 
} 
+0

Merci, ma vie est meilleure maintenant! :) Cependant, juste en passant par un objet Moq, IEndpointInstance fonctionne aussi bien. – SayusiAndo