2009-12-03 8 views

Respuesta

10

Se necesita más contexto. Así que voy a poner uno aquí añadiendo a la mezcla Moq:

pubilc class Calc { 
    public int DoubleIt(string a) { 
     return ToInt(a)*2; 
    } 

    public virtual int ToInt(string s) { 
     return int.Parse(s); 
    } 
} 

// The test: 
var mock = new Mock<Calc>(); 
string parameterPassed = null; 
mock.Setup(c => x.ToInt(It.Is.Any<int>())).Returns(3).Callback(s => parameterPassed = s); 

mock.Object.DoubleIt("3"); 
Assert.AreEqual("3", parameterPassed); 
+0

¿Funciona esto cuando Calc no es abstracto o interfaz? Por lo que sé, 'Moq' hace proxies dinámicos para hacer que sus burlas no generen nuevas instrucciones IL para que esto sea posible ... – kuskmen

11

Tienes que utilizar un marco de burla, como Typemock o Rhino Mocks, o NMocks2.

NUnit también tiene un Nunit.Mock, pero no es muy conocido.

La sintaxis para moq se puede encontrar here:

var mock = new Mock<ILoveThisFramework>(); 

// WOW! No record/reply weirdness?! :) 
mock.Setup(framework => framework.DownloadExists("2.0.0.0")) 
    .Returns(true) 
    .AtMostOnce(); 

// Hand mock.Object as a collaborator and exercise it, 
// like calling methods on it... 
ILoveThisFramework lovable = mock.Object; 
bool download = lovable.DownloadExists("2.0.0.0"); 

// Verify that the given method was indeed called with the expected value 
mock.Verify(framework => framework.DownloadExists("2.0.0.0")); 

Además, tenga en cuenta que sólo puede burlarse interfaz, así que si su objeto desde System.IO.File no tiene una interfaz, entonces probablemente se puede' hacer Debe envolver su llamada al System.IO.File dentro de su propia clase personalizada para el trabajo.

+2

NUnit solo ejecuta pruebas, no hace burla o verificación. Diferentes responsabilidades. Debería poder verificar las expectativas en su objeto simulado, aunque no he usado Moq. – kyoryu

+0

sí, estaba buscando en el lugar equivocado ... estaba buscando en nunit. ahora estoy mirando moq. :) –

+0

MOQ le permitirá simular clases abstractas también. –

3

Utilizando un simulacro para una interfaz.

Digamos que tienes tu clase ImplClass que utiliza la interfaz Finder y quiere asegurarse de que la función se llama a Search con el argumento "hola";

Así tenemos:

public interface Finder 
{ 
    public string Search(string arg); 
} 

y

public class ImplClass 
{ 
    public ImplClass(Finder finder) 
    { 
    ... 
    } 
    public void doStuff(); 
} 

entonces usted puede escribir una maqueta para su código de prueba

private class FinderMock : Finder 
{ 
    public int numTimesCalled = 0; 
    string expected; 
    public FinderMock(string expected) 
    { 
    this.expected = expected; 
    } 
    public string Search(string arg) 
    { 
    numTimesCalled++; 
    Assert.AreEqual(expected, arg); 
    } 
} 

entonces el código de prueba:

FinderMock mock = new FinderMock("hello"); 
ImplClass impl = new ImplClass(mock); 
impl.doStuff(); 
Assert.AreEqual(1, mock.numTimesCalled); 
2

En burla de Rhino, donde es un método llamado AssertWasCalled

Aquí está una manera de utilizarla

var mailDeliveryManager = MockRepository.GenerateMock<IMailDeliveryManager>(); 
 

 
var mailHandler = new PlannedSending.Business.Handlers.MailHandler(mailDeliveryManager); 
 

 
mailHandler.NotifyPrinting(User, Info); 
 

 
mailDeliveryManager.AssertWasCalled(x => x.SendMailMessage(null, null, null), o => o.IgnoreArguments());

Cuestiones relacionadas