referencia por pase pasar pasaje parametros objetos metodos funciones con como c# unit-testing moq

c# - por - Métodos Moq''ing donde la expresión<Func<T, bool>> se pasan como parámetros



pase de parametros por referencia c# (3)

Debería poder usar It.IsAny<>() para lograr lo que desea hacer. Con el uso de It.IsAny<>() simplemente puede ajustar el tipo de retorno para su configuración para probar cada rama de su código.

It.IsAny<Expression<Func<Company, bool>>>()

Primera prueba, devuelva una empresa independientemente del predicado que provocará la excepción:

var repoMock = new Mock<IRepository<Company>>(); repoMock.Setup(moq => moq.FindBy(It.IsAny<Expression<Func<Company, bool>>>())).Returns(new List<Company>{new Company{Name = "Company Inc"}}); var signupLogic = new SignupLogic(repoMock.Object); signupLogic.AddNewCompany(new Company {Name = "Company Inc"}); //Assert the exception was thrown.

Segunda prueba, haga que el tipo de retorno sea una lista vacía que hará que se llame add:

var repoMock = new Mock<IRepository<Company>>(); repoMock.Setup(moq => moq.FindBy(It.IsAny<Expression<Func<Company, bool>>>())).Returns(new List<Company>()); var signupLogic = new SignupLogic(repoMock.Object); signupLogic.AddNewCompany(new Company {Name = "Company Inc"}); repoMock.Verify(r => r.Add(It.IsAny<Company>()), Times.Once());

¡Soy muy nuevo en pruebas unitarias y burlas! Estoy intentando escribir algunas pruebas unitarias que cubren algunos códigos que interactúan con un almacén de datos. El acceso a los datos está encapsulado por IRepository:

interface IRepository<T> { .... IEnumerable<T> FindBy(Expression<Func<T, bool>> predicate); .... }

El código que estoy tratando de probar, utilizando una implementación concreta IoC''d de IRepository se ve así:

public class SignupLogic { private Repository<Company> repo = new Repository<Company>(); public void AddNewCompany(Company toAdd) { Company existingCompany = this.repo.FindBy(c => c.Name == toAdd.Name).FirstOrDefault(); if(existingCompany != null) { throw new ArgumentException("Company already exists"); } repo.Add(Company); repo.Save(); } }

Para probar la lógica de SignupLogic.AddNewCompany (), en lugar de la lógica y el Repositorio concreto, me estoy burlando de IRepository y pasándolo a SignupLogic. El Repositorio simulado se ve así:

Mock<Repository> repoMock = new Mock<Repository>(); repoMock.Setup(moq => moq.FindBy(c => c.Name == "Company Inc")....

que devuelve un IEnumberable en la memoria que contiene un objeto Company con el nombre establecido en "Company Inc". La prueba unitaria que llama a SignupLogic.AddNewCompany configura una empresa con detalles duplicados y trata de pasar eso, y afirmo que se lanza una ArgumentException con el mensaje "La compañía ya existe". Esta prueba no está pasando.

Depurando a través de la prueba unitaria y AddNewCompany () mientras se ejecuta, parecería que la compañía existente es siempre nula. En la desesperación, he encontrado que si actualizo SignupLogic.AddNewCompany () para que la llamada a FindBy se vea así:

Company existingCompany = this.repo.FindBy(c => c.Name == "Company Inc").FirstOrDefault();

la prueba pasa, lo que me sugiere que Moq solo responde al código que es exactamente el mismo que he configurado en mi accesorio de prueba. Obviamente, eso no es especialmente útil para probar que cualquier compañía duplicada sea rechazada por SignupLogic.AddNewCompany.

Intenté configurar moq.FindBy (...) para usar "Is.ItAny", pero eso no hace que pase la prueba tampoco.

De todo lo que estoy leyendo, parece que probar Expressions como lo estoy intentando no es realmente posible con Moq aquí. ¿Es posible? ¡Por favor ayuda!


Normalmente solo te burlas de los tipos que tienes. Aquellos que no son de su propiedad, en realidad no se deben burlar debido a varias dificultades. Expresiones burlonas, como lo implica el nombre de su pregunta, no es el camino a seguir.

En el marco de Moq. Es importante poner .Returns() para funciones de lo contrario no coincide. Entonces, si no lo has hecho, es tu problema.

repoMock.Setup(moq => moq.FindBy(c => c.Name == "Company Inc").Returns(....


Probablemente sea correcto que solo una Expression con la misma estructura (y valores literales) coincida. Sugiero que use la sobrecarga de Returns() que le permite usar los parámetros con los que se llama el simulacro:

repoMock.Setup(moq => moq.FindBy(It.IsAny<Expression<Func<Company, bool>>>()) .Returns((Expression<Func<Company, bool>> predicate) => ...);

En ... , puede usar el predicate para devolver las empresas que coinciden (y tal vez incluso emitir una excepción si las empresas coincidentes no son las que esperaba). No es muy bonito, pero creo que funcionará.