2011-05-17 25 views
8

Intentando probar la unidad de una clase cuyo constructor toma una Func. No estoy seguro de cómo burlarlo usando Moq.Cómo moq a Func

public class FooBar 
{ 
    public FooBar(Func<IFooBarProxy> fooBarProxyFactory) 
    { 
     _fooBarProxyFactory = fooBarProxyFactory; 
    } 
} 



[Test] 
public void A_Unit_Test() 
{ 
    var nope = new Mock<Func<IFooBarProxy>>(); 
    var nope2 = new Func<Mock<IFooBarProxy>>(); 

    var fooBar = new FooBar(nope.Object); 
    var fooBar2 = new FooBar(nope2.Object); 

    // what's the syntax??? 
} 

Respuesta

7

lo descubrió

public interface IFooBarProxy 
{ 
    int DoProxyStuff(); 
} 

public class FooBar 
{ 
    private Func<IFooBarProxy> _fooBarProxyFactory; 

    public FooBar(Func<IFooBarProxy> fooBarProxyFactory) 
    { 
     _fooBarProxyFactory = fooBarProxyFactory; 
    } 

    public int DoStuff() 
    { 
     var newProxy = _fooBarProxyFactory(); 
     return newProxy.DoProxyStuff(); 
    } 
} 

[TestFixture] 
public class Fixture 
{ 
    [Test] 
    public void A_Unit_Test() 
    { 
     Func<IFooBarProxy> funcFooBarProxy =() => 
     { 
      var mock = new Mock<IFooBarProxy>(); 
      mock.Setup(x => x.DoProxyStuff()).Returns(2); 
      return mock.Object; 
     }; 
     var fooBar = new FooBar(funcFooBarProxy); 

     var result = fooBar.DoStuff(); 
     Assert.AreEqual(2, result); 
    } 
} 
+4

No creo que haya burlado la 'Func' Creo que va a devolver un objeto imaginario a partir de una' Func'. – briantyler

+0

¿Cómo se configura para que pueda probar una instancia de IFooBarProxy que se devolverá cuando llame al Func en FooBar? – Jon

+1

hey @Jon, agregué una respuesta más completa, demostrando cómo hacer afirmaciones sobre el objeto burlado. Espero que eso ayude – kenwarner