Edited at

Entity Framework core関連の処理をIn Memory DBを利用してテストする


環境

Asp.Net Core 2.0.8

.Net Core 2.0

Entity Framework core 2.0.2

mssqllocaldb

MSTest


プロダクトコード


DataModelを作成


User.cs

public partial class User
{
public int Id { get; set; }
public string Name { get; set; }
public bool IsEnabled { get; set; }
}



DBContextを作成


HogeDbContext.cs


public partial class HogeDbContext : DbContext
{
public virtual DbSet<User> User { get; set; }

public HogeDbContext(DbContextOptions<HogeDbContext> option) : base(option) { }
}



DB ContextをDIコンテナに登録


Start.cs

        public void ConfigureServices(IServiceCollection services)

{
services.AddDbContext<HogeDbContext>(options => options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")));
services.AddMvc();
}


appsettings.JsonにDB接続文字列を設定


appsettings.json

{

"ConnectionStrings": {
"DefaultConnection": "Server=(localdb)\\mssqllocaldb;Database=Hoge;Trusted_Connection=True;"
}
}


テスト対象


HogeLogic.cs

    public interface IUserlogic

{
IEnumerable<User> Get();
}

public class UserLogic
{
private HogeDbContext _dbContext;

public UserLogic(HogeDbContext dbContext)
{
_dbContext = dbContext;
}

public IEnumerable<User> Get()
{
return _dbContext.User.Where(u => u.IsEnabled);
}
}



テストコード


UserLogicTests.cs

    [TestClass]

public class UserLogicTests
{

[ClassInitialize]
public static void ClassInitialize(TestContext testContext)
{
var options = new DbContextOptionsBuilder<HogeDbContext>()
.UseInMemoryDatabase(databaseName: "Hoge")
.EnableSensitiveDataLogging()
.Options;
using(var context = HogeDbContext(options))
{
context.User.Add(new User { Id = 1, Name="TestName1", IsEnabled = true});
context.User.Add(new User { Id = 2, Name="TestName2", IsEnabled = false});
context.SaveChanges();
}
}

[TestMethod]
public void 正常系_Get()
{
// arrange
var options = new DbContextOptionsBuilder<HogeDbContext>()
.UseInMemoryDatabase(databaseName: "Hoge")
.EnableSensitiveDataLogging()
.Options;

using(var context = HogeDbContext(options))
{
// act
var target = new UserLogic(context)
var result = target.Get();

// assert
Assert.IsNotNull(result);
Assert.AreEqual(1, result.Count());
Assert.IsTrue(result.Any(r => r.Id == 1 && r.Name == "TestName1"));
}
}
}


In Memory DBを利用するように設定したDbContextOptionをコンスタントに渡すことで、

テスト時にIn Memory DBを利用できる。

DIコンテナ利用しない場合はDbContextのコンストラクタで良しなにすれば同様に

In Memory DBがテストで利用できる。