2017-07-25 5 views
2

Par rapport à my last question on Mocking the HttpContext, je devais changer la méthode testée àComment copier HttpContext.Current.GetOwinContext() avec Nunit et RhinoMocks?

public override void OnActionExecuting(HttpActionContext actionContext) 
{ 
    HttpContext.Current.GetOwinContext().Set("RequestGUID", NewId.NextGuid()); 
    base.OnActionExecuting(actionContext); 
} 

Maintenant, je dois comprendre comment se moquer de la HttpContext.Current.GetOwinContext(), Je pourrais écrire un stub pour la méthode Set(), ou généralement être capable de tester cette ligne particulière. Comment puis-je faire ceci?

Répondre

2

J'ai lu this article, mais dans votre cas, je pense que faire une telle chose serait exagéré ..

Depuis GetOwinContext() retour d'une interface tout ce que vous devez faire est de séparer cet appel de la méthode, faire une telle chose a 2 problèmes:

  1. La méthode à l'essai (OnActionExecuting() appartient à une classe d'attributs
  2. GetOwinContext() est une méthode statique
..

Les 2 meilleures solutions que je peux vous offrir est:

  1. outil onduler Utilisez le code comme MsFakes, Typemock isolator et etc, au lieu d'outil proxy comme RhinoMocks.
  2. Extrait GetOwinContext() à une méthode virtuelle, puis utiliser la technique PartialMock (Cette technique est généralement utilisée pour les classes abstraites):

Disons que MyCustonAttributte est votre attribut:

public class MyCustonAttributte : ActionFilterAttribute 
{ 
    public override void OnActionExecuting(HttpActionContext actionContext) 
    { 
     GetOwinContext().Set("RequestGUID", Guid.NewGuid()); 
     base.OnActionExecuting(actionContext); 
    } 

    public virtual IOwinContext GetOwinContext() 
    { 
     return HttpContext.Current.GetOwinContext(); 
    } 
} 

Ensuite, votre UT sera:

[Test] 
public void New_GUID_should_be_added_when_OnActionExecuting_is_executing() 
{ 
    //arrange section: 
    const string REQUEST_GUID_FIELD_NAME = "RequestGUID"; 
    var owinContext = MockRepository.GenerateStub<IOwinContext>(); 

    var target = MockRepository.GeneratePartialMock<MyCustonAttributte>(); 

    target.Stub(x => x.GetOwinContext()) 
     .Return(owinContext); 

    //act: 
    target.OnActionExecuting(new HttpActionContext()); 

    //assert section: 
    owinContext.AssertWasCalled(x => x.Set(Arg<string>.Is.Equal(REQUEST_GUID_FIELD_NAME), 
     Arg<Guid>.Is.NotEqual(Guid.Empty))); 
} 
+0

Fonctionne comme un charme. GUID étant ajouté à la collection est la seule chose que j'ai eu/voulait tester de toute façon ... Merci un million. – Eedoh