Pregunta

Soy nuevo en el uso de Moq y no puedo encontrar la manera de hacerlo. Tengo un método privado generateId, llamado

/// <summary>
/// Generates a call Id for external interfaces
/// </summary>
/// <returns></returns>
private string GenerateCallId()
{
return "EX" + SharedServicesClientProxy.Instance.GenerateId().ToString();
}

Quería probar este método por unidad, y por esa razón necesito burlarme del Proxy. SharedServicesClientProxy es solo un objeto que implementa la interfaz ISharedServices pero agrega el singleton. Quería probar que todas las cadenas devuelven correctamente una cadena que comienza con "EX". esta es mi prueba de unidad, usando Moq

    /// <summary>
    /// A test for GenerateCallId
    /// A CallId for external systems should always start by "EX"
    ///</summary>
    [TestMethod()]
    [DeploymentItem("myDll.dll")]
    public void GenerateCallIdTest()
    {
        myService_Accessor target = new myService_Accessor();
        var SharedServicesClientProxy = new Mock<ISharedServices>();
        SharedServicesClientProxy.Setup(x => x.GenerateId()).Returns(5396760556432785286);
        string actual;
        string extCallIdPrefix = "EX";
        actual = target.GenerateCallId();
        Assert.IsTrue(actual.StartsWith(extCallIdPrefix));
    }

¿Supongo que me estoy burlando del lugar equivocado?

De una manera más general, ¿cómo me burlo de un objeto que será llamado por el método que estoy probando? por ejemplo:

        /// <summary>
        /// dummy test
        ///</summary>
        [TestMethod()]
        [DeploymentItem("myDll.dll")]
        public void Foo()
        {
            myService_Accessor target = new myService_Accessor();
            boolexpected = false;
            actual = target.Foo();
            Assert.IsTrue(actual,expected);
        }

        /// <summary>
        /// Foo
        /// </summary>
        /// <returns></returns>
        private bool Foo()
        {
            return this.Bar();
        }

Necesito moq Bar, pero ¿dónde debo hacerlo? Gracias, Seb

¿Fue útil?

Solución

Busque el término " Inyección de dependencias " antes de continuar.

Tiene una dependencia en SharedServicesClientProxy.Instance , que es Singleton. Esto causará problemas con el aislamiento de la prueba, ya que reutilizará la misma instancia en todas las pruebas y será propenso a problemas de estado restante.

Recomiendo inyectar dependencias como esta (y OT- no deberías probar métodos privados ... prueba a través de la interfaz pública. Está fuera de mi sistema ... :)

public class AnonClass
{
  ISharedServices _sharedServices;
  AnonClass(ISharedServices sharedServicesObj)
  {
    _sharedServices = sharedServicesObj;
  }
  public string GenerateCallId()
  {
    return "EX" + _sharedServices.GenerateId().ToString();
  }
}

Vuelva a cablear su código actual para crear la clase de destino como esta

var class = new AnonClass(SharedServicesClientProxy.Instance);

En su prueba, pase el objeto simulado en lugar del objeto devuelto por Singleton

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top