mardi 9 avril 2019

EF Core + NUnit tests with InMemoryDatabase and Identity columns

.Net Core 2.2 / EFC 2.2.3 / Pomelo.EntityFrameworkCore.MySql 2.2.0

Imagine that you have a table called Colors with some predefined data.

public void Configure(EntityTypeBuilder<Color> builder)
{
    builder.ToTable("Colors");
    builder.HasKey(r => r.Id).UseMySqlIdentityColumn();
    builder.Property(r => r.Name).IsRequired().HasMaxLength(255);
    builder.Property(v => v.RGB).IsRequired().HasMaxLength(7);
    builder.HasData(GetSeed());
}
private ICollection<Color> GetSeed()
{
    return new List<Color>()
    {
        new Color(){Id=1, Name="Black", RGB="#000"},
        new Color(){Id=2, Name="White", RGB="#fff"},
    }
}

One of my tests is to test the CreateColorCommandHandler. Very straightfoward

var Context = CBERPContextFactory.Create();
var query = new CreateColorCommandHandler(Context);

var command = new CreateColorCommand();
command.Name= "Random color";
command.RGB = "#001122";

var colorId = await query.Handle(command, CancellationToken.None);

//Assert
Assert.IsInstanceOf<long>(colorId);
Assert.NotZero(colorId);

var cor = Context.Colors.Where(p => p.Id == colorId).SingleOrDefault();
Assert.NotNull(cor);
Assert.AreEqual(command.Name, cor.Name);
Assert.AreEqual(command.RGB, cor.RGB);

CBERPContextFactory.Destroy(Context);

//>>> Handle simply add a new entity without informing ID

When I ran this test I get the error An item with the same key has already been added. Key: 1. Which means that InMemoryDatabase do not has auto increment feature.

Am I writing the test wrong?

How can I test case like this? I want to make sure that the command is OK.

Probably I am missing some very basic rule here.

Aucun commentaire:

Enregistrer un commentaire