es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Moq – La configuración genérica no devuelve el valor esperado

Soy nuevo en Moq, aquí tengo dos configuraciones.

var settingsMock = new Mock<iecsconfigsettings>();
settingsMock.Setup(m => m.GetRootValue("ss", It.IsAny<string>())).Returns("aaa");

Y otra es

private static void BuildSettingCacheForMock<t>(Mock<iecsconfigsettings> mock, string key, T value)
{
    mock.Setup(m => m.GetRootValue<t>(key, It.IsAny<t>())).Returns(value);
    mock.Setup(m => m.GetValue<t>(key, It.IsAny<t>())).Returns(value);
    mock.Setup(m => m.TryGetValue<t>(key, out value)).Returns(true);
    mock.Setup(m => m.TryGetRootValue<t>(key, out value)).Returns(true);
}
var settingsMock = new Mock<iecsconfigsettings>();
BuildSettingCacheForMock<string>(settingsMock, "sss", "aaa1");

Finalmente, cuando los invoco a ambos

var s1 = new SettingsETag(settingsMock.Object, etag: "ETag", null).Settings.GetRootValue("ss"); // da "aaa"
var s2 = new SettingsETag(settingsMock.Object, etag: "ETag", null).Settings.GetRootValue("sss"); // da null

Detalles de la interfaz
Código de la interfaz

No sé cuáles son las diferencias entre estos y por qué el resultado para el segundo es null. ¡Agradezco tus ideas sobre esto!

Tags:  , ,

Answer

  1. Avatar for davy.ai

    La primera configuración consiste en establecer el objeto simulado para que devuelva “aaa” cada vez que se llame al método GetRootValue con los parámetros “ss” y cualquier valor de cadena.

    La segunda configuración es un método auxiliar que establece el objeto simulado para que devuelva el valor dado cada vez que se llame a los métodos GetRootValue, GetValue, TryGetValue o TryGetRootValue con la clave especificada y cualquier valor de tipo T. En este caso, se establece específicamente el objeto simulado para que devuelva “aaa1” cada vez que se llame a cualquiera de estos métodos con la clave “sss” y cualquier valor de cadena.

    La razón por la que la segunda invocación devuelve null es porque se utiliza el método GetRootValue en lugar de GetRootValue, que es lo que se configuró en la segunda configuración. Por lo tanto, no coincide con ninguna de las configuraciones en el objeto simulado y devuelve null por defecto. Si cambias la segunda invocación para que use GetRootValue(“sss”), debería devolver “aaa1”, como se esperaba.

Comments are closed.