2011-06-05 8 views
5

que tienen clase con 2 métodosMétodo y simulacro con una misma clase

class A 
{ 
    void Fun() 
    { 
    if(FunRet()>0){///} else {///} 
    } 
    int FunRet() 
    { return 4;} 
}; 

quiero() método divertido test dependerá de lo FunRet devoluciones. Entonces quiero burlarme de FunRet. Prefiero no hacer que FunRet sea virtual. ¿Como puedo hacer eso?

Respuesta

0

Creo que te falta el puntero.

... if (this->FunRet() > 0) { ...

3

Usted puede inyectar dependencias intra-clase. En este caso, haga que Fun acepte un valor en lugar de calcularlo:

class A 
{ 
    void Fun(int x) 
    { 
    if(x>0){///} else {///} 
    } 
    int FunRet() 
    { return 4;} 
}; 

Luego sus pruebas pueden pasar valores arbitrarios a Fun(). Si tiene que cumplir el uso correcto, escribir una versión pública para exponer en su API y una versión privada para la prueba:

class A { 
public: 
    void Fun() { return Fun(FunRet()); } 
private: 
    void Fun(int x); // for testing. 
}; 
1

Usted puede extraer el método de la diversión en una clase del calculador que implementa una interfaz. Debería pasar una instancia de esa interfaz a la clase A en el constructor.

En las pruebas podría tener otras clases implementando esa interfaz, que devuelven otros valores.

Este método también tiene la gran ventaja de que separa las preocupaciones de calcular un valor y usar el valor calculado.

class A { 
public: 
    A (IFunCalc calc) { m_calc = calc; } 
    void Fun { if calc.FunRet() > 4 ... } 
private: 
    IFunCalc m_calc; 
} 
class FunCalc : IFunCulc { 
public: 
    int FunRet { return 4; } 
} 
class FunCalc4Test : IFunCalc { 
public: 
    int FunRet { return 27; } 
} 
0

Si utiliza la inyección de dependencias y la plantilla de su objeto bajo prueba, puede utilizar los objetos de imitación sin tener que utilizar las funciones virtuales.

class AParameters 
{ 
public: 
    int FunRet() 
    { return 4;} 
}; 

class MockAParameters 
{ 
public: 
    MOCK_METHOD0(FunRet, int()); 
}; 

template<class Parameters> 
class AImpl 
{ 
public: 
    AImpl(Parameters& parameters):parameters(parameters){} 

    void Fun() 
    { 
    if(parameters.FunRet()>0){///} else {///} 
    } 

private: 
    Parameters& parameters; 
}; 

typedef AImpl<AParameters> A; 
typedef AImpl<MockAParameters> ATestObject; 

void Test::funUsesFunRet() 
{ 
    MockAParameters params; 
    EXPECT_CALL(params, FunRet()); 
    ATestObject object(params); 
    object.Fun(); 
} 
0

Creo FunRet es un detalle de implementación interna de Fun. Como resultado, Fun no necesita ser probado de forma aislada desde FunRet. Simplemente pruebe Fun y no se preocupe por el hecho de que llama al FunRet.

Cuestiones relacionadas