He tenido algunas ocasiones en que algo como esto sería útil. Tengo, por ejemplo, un AccountCreator
con un método Create
que toma un NewAccount
. Mi AccountCreator
tiene un IRepository
que eventualmente se usará para crear la cuenta. Mi AccountCreator
primero mapeará las propiedades de NewAccount
a Account
, segundo pase el Account
al repositorio para finalmente crearlo. Mis pruebas buscan algo como esto:¿Cómo se usa moq para verificar que se haya pasado un objeto similar como argumento?
public class when_creating_an_account
{
static Mock<IRepository> _mockedRepository;
static AccountCreator _accountCreator;
static NewAccount _newAccount;
static Account _result;
static Account _account;
Establish context =() =>
{
_mockedRepository = new Mock<IRepository>();
_accountCreator = new AccountCreator(_mockedRepository.Object);
_newAccount = new NewAccount();
_account = new Account();
_mockedRepository
.Setup(x => x.Create(Moq.It.IsAny<Account>()))
.Returns(_account);
};
Because of =() => _result = _accountCreator.Create(_newAccount);
It should_create_the_account_in_the_repository =() => _result.ShouldEqual(_account);
}
Por lo tanto, lo que necesito es algo para reemplazar It.IsAny<Account>
, porque eso no ayuda a verificar que la cuenta correcta fue creado. Lo que sería sorprendente es algo así como ...
public class when_creating_an_account
{
static Mock<IRepository> _mockedRepository;
static AccountCreator _accountCreator;
static NewAccount _newAccount;
static Account _result;
static Account _account;
Establish context =() =>
{
_mockedRepository = new Mock<IRepository>();
_accountCreator = new AccountCreator(_mockedRepository.Object);
_newAccount = new NewAccount
{
//full of populated properties
};
_account = new Account
{
//matching properties to verify correct mapping
};
_mockedRepository
.Setup(x => x.Create(Moq.It.IsLike<Account>(_account)))
.Returns(_account);
};
Because of =() => _result = _accountCreator.Create(_newAccount);
It should_create_the_account_in_the_repository =() => _result.ShouldEqual(_account);
}
Aviso Me cambió It.IsAny<>
a It.IsLike<>
y se pasa en un objeto Account
poblada. Idealmente, en el fondo, algo compararía los valores de la propiedad y lo dejaría pasar si todos coinciden.
Entonces, ¿ya existe? ¿O podría ser algo que hayas hecho antes y no te importaría compartir el código?
Moq apoya comparadores personalizados - como en, puede tener comparadores personalizados usa cuando se compara argumentos para una llamada , pero tienes que implementarlo tú mismo. Vea el ejemplo [aquí] (http://stackoverflow.com/a/10300051/343266). –