如何从SQLite内存数据库中提取行版本值

时间:2018-08-03 10:15:19

标签: sqlite unit-testing asp.net-core xunit.net

我当前正在为我的单元测试实现数据库集合/夹具,如此处有关此问题的文档所述:

xUnit.net - run code once before and after ALL tests

但是,我不是使用InMemory数据库,而是使用SQLite,因为InMemory当前在.Net Core 2.1中存在一个错误,该错误doesn't do a sequence check when using a byte array type

这导致了我当前的困境,即当将上下文从数据库夹具中拉到单元测试中时,设置数据库夹具时的字节数组没有被拉到单元测试中。尝试运行测试时会导致并发错误。

例如:

拳头这样设置DatabaseFixture类:

public class DatabaseFixture : IDisposable
{
    public DatabaseFixture()
    {
        var connectionStringbuilder = new SqliteConnectionStringBuilder{DataSource = ":memory:", Cache = SqliteCacheMode.Shared};
        var connection = new SqliteConnection(connectionStringbuilder.ToString());

        options = new DbContextOptionsBuilder<CRMContext>()
            .UseSqlite(connection)
            .EnableSensitiveDataLogging()
            .Options;

        using (var context = new CRMContext(options))
        {
            context.Database.OpenConnection();
            context.Database.EnsureCreated();                              
            context.Persons.AddRange(persons);
            context.SaveChanges();
        } 


    }
    public DbContextOptions<CRMContext> options { get; set; }

    public void Dispose()
    {
        using (var context = new CRMContext(options))
        {
            context.Database.CloseConnection();

            context.Dispose();
        }
    }
    private IQueryable<Person> persons = new List<Person>()
        {
            new Person
            {
                Id = 1, 
                Forename = "Test",
                Surname = "User",
                RowVersion = new byte[0]
            },
            new Person
            {
                Id = 2, 
                Forename = "Another",
                Surname = "Test",
                RowVersion = new byte[0]
            }
        }.AsQueryable();
}

根据first link设置空的DatabaseCollection类:

 [CollectionDefinition("Database collection")]
public class DatabaseCollection : ICollectionFixture<DatabaseFixture>
{
}

然后设置您的单元测试以使用此数据库夹具:

[Collection("Database collection")]
 public class PersonTests : BaseTests
{
    private readonly DatabaseFixture _fixture;

    public PersonTests(DatabaseFixture fixture)
    {
        _fixture = fixture;
    }
    [Fact]
    public void SaveAndReturnEntityAsync_SaveNewPerson_ReturnsTrue()
    {
            {

        using (var context = new Context(_fixture.options))
        {
            var existingperson = new Person
            {
                Id = 2,
                Forename = "Edit",
                Surname = "Test",
                RowVersion = new byte[0]
            };
            var mapperConfig = new MapperConfiguration(cfg => { cfg.AddProfile(new InitializeAutomapperProfile()); });

            var AlertAcknowledgeService = GenerateService(context);

            //Act
            //var result = _Person.SaveAndReturnEntityAsync(mappedPersonAlertAcknowledge);
            //Assert
            Assert.Equal("RanToCompletion", result.Status.ToString());
            Assert.True(result.IsCompletedSuccessfully);
            Assert.Equal("The data is saved successfully", result.Result.SuccessMessage);
        }
    }

现在,当我调试它时,它可以正确地击中夹具,并且可以在展开“结果”视图时正确分配RowVersion变量:

Correct Row Version value

但是,当数据传递到单元测试中时,行版本将设置为null:

Row Version set to null

对此将提供任何帮助!

0 个答案:

没有答案