Decir que tengo la siguiente interfaz:
public interface ITeam { bool HasPlayer(IPlayer player); void AddPlayer(IPlayer player); }Actualmente tengo una prueba que parece algo similar a (usando AutoMoq):
[Theory] [MyAutoData] public void ShouldRosterToTeamWhenPlayerIsNotRostered(Player player, Mock<ITeam> mockedTeam) { player.RosterToTeam(mockedTeam.Object); mockedTeam.Verify(team => team.AddPlayer(player), Times.Once); } Sin embargo, una condición previa en mi código es que HasPlayer debe devolver falso para que la prueba pase cuando se llama a RosterToTeam .
Esto se puede resolver creando una ICustomization y componiendo directamente el comportamiento correcto, por ejemplo:
public class TeamCustomization : ICustomization { public void Customize(IFixture fixture) { fixture.Customize<Mock<ITeam>>(composer => composer.Do(mock => mock.Setup(team => team.HasPlayer(It.IsAny<IPlayer>())) .Returns(false))); } } Sin embargo, me gustaría que mis pruebas supongan siempre que los métodos booleanos tienen un valor predeterminado de false . Intenté buscar en ISpecimenBuilder , pero no pude encontrar una manera de lograr esto, ya que parece que solo funciona en propiedades, parámetros, etc.
¿Alguien puede recomendarme una forma de configurar genéricamente todos los métodos booleanos para que devuelvan falso de forma predeterminada cuando se crean de esta manera?
Editar: el culpable detrás del cambio de comportamiento es cuando ConfigureMembers = true está configurado para AutoMoqCustomization .
Así es como se ve actualmente mi MyAutoDataAttribute :
public class MyAutoDataAttribute : AutoDataAttribute { public MyAutoDataAttribute() : base(Create) { } private static IFixture Create() { var fixture = new Fixture(); fixture.Customize(new AutoMoqCustomization { ConfigureMembers = true }); fixture.Customize(new TeamCustomization()); return fixture; } } Para mi caso de uso, aún se necesita ConfigureMembers = true (y me gustaría eliminar TeamCustomization ).
En primer lugar, es posible que desee utilizar AutoMoqDataAttribute para crear una simulación de la interfaz de ITeam :
public class AutoMoqDataAttribute : AutoDataAttribute { public AutoMoqDataAttribute() : base(new Fixture().Customize(new AutoMoqCustomization())) { } }No es necesario personalizar el accesorio para configurar sus simulacros. Será mejor que hagas eso en las pruebas en sí (la sección de organización):
[Theory, AutoMoqData] public void ShouldRosterToTeamWhenPlayerIsNotRostered(Player player, Mock<ITeam> mockedTeam) { mockedTeam.Setup(t => t.HasPlayer(player)).Returns(false); player.RosterToTeam(mockedTeam.Object); mockedTeam.Verify(team => team.AddPlayer(player), Times.Once); } [Theory, AutoMoqData] public void ShouldNotRosterToTeamWhenPlayerIsRostered(Player player, Mock<ITeam> mockedTeam) { mockedTeam.Setup(t => t.HasPlayer(player)).Returns(true); player.RosterToTeam(mockedTeam.Object); mockedTeam.Verify(team => team.AddPlayer(player), Times.Never); }y, finalmente, la implementación simplificada de RoastToTeam:
public class Player { public void RosterToTeam(ITeam team) { if (team.HasPlayer(this)) { return; } team.AddPlayer(this); } }