valor referencia programacion por pasar pasaje parametros objetos metodos funciones como argumentos c# unit-testing moq

c# - referencia - MOQ: configuración de un método basado en valores de argumento(argumentos múltiples)



parametros programacion c# (2)

Para los métodos de argumento único, la forma más limpia sería:

mock.Setup(foo => foo.Submit(IsLarge())).Throws<ArgumentException>(); ... public string IsLarge() { return Match<string>.Create(s => !String.IsNullOrEmpty(s) && s.Length > 100); }

Esto no se puede aplicar si el método tiene varios argumentos. Todavía hay una ''solución alternativa'' que podría usarse, que imita lo que quiere lograr:

/// <summary> /// Tests if a moq can send an exception with argument checking ///</summary> [TestMethod] public void TestException() { Mock<IMath> mock = new Mock<IMath>(); mock.Setup(m => m.AddNumbersBetween(It.IsAny<int>(), It.IsAny<int>())); mock.Setup(foo => foo.AddNumbersBetween(It.IsAny<int>(), It.IsAny<int>())) .Callback<int, int>((i, j) => CheckArgs(i, j)); try { mock.Object.AddNumbersBetween(1, 2); } catch (Exception ex) { // Will not enter Console.WriteLine("Exception raised: {0}", ex); } try { mock.Object.AddNumbersBetween(2, 1); } catch (Exception ex) { // Will enter here, exception raised Console.WriteLine("Exception raised: {0}", ex); } } private bool CheckArgs(int i, int j) { if( i > j) throw new ArgumentException(); return true; }

Tengo una interfaz definida como

interface IMath { AddNumbersBetween(int lowerVal, int upperVal); }

Puedo configurar un Moq básico para lo anterior de la siguiente manera:

Mock<IMath> mock = new Mock<IMath>(); mock.Setup(m => m.AddNumbersBetween(It.IsAny<int>(), It.IsAny<int>()));

llámalo

mock.Object.AddNumbersBetween(1,4);

y luego verificar que se llamara

mock.Verify(m => m.AddNumbersBetween(1,4), Times.AtleastOnce());

No puedo averiguar cómo configurar el método AddNumbersBetween de modo que si el upperVal es más bajo que el lowerVal se lanza una excepción

mock.Object.AddNumbersBetween(4,1);//should throw an exception

Esencialmente buscando algo como:

mock.Setup(foo => foo.AddNumbersBetween("arg1 is higher than arg2")).Throws<ArgumentException>();


Sé que este es un año de antigüedad, pero encontré una forma de usar múltiples parámetros con la última versión de Moq al menos:

mock.Setup(x => x.Method(It.IsAny<int>(), It.IsAny<int>()) .Returns<int, int>((a, b) => a < b);