私はEFでGenericRepositoryを作成して初めてユニットテストを作成しています。 GetAll()
およびUpdate()
のテストが合格したが、Add()
およびDelete()
に合格しなかった。なぜそれがAdd
ではないのですか?私はそれが1行のコードであり、私はそれを理解することができなかったので、私の髪を引っ張っています。私はEFデータベースを使用しています。まず、Nunit、Nsubstitute。テスト時に汎用リポジトリがコンテキストにエンティティを追加しない
アドバイスは歓迎されます。
MyEntities
public partial class MyEntities : DbContext{
public MyEntities()
: base("name=MyEntities")
{
}
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
throw new UnintentionalCodeFirstException();
}
public virtual DbSet<Customer> Cusotmers{ get; set; }
テスト
public static class NSubstituteUtils {
public static DbSet<T> CreateMockDbSet<T>(IQueryable<T> data = null)
where T : class {
var mockSet = Substitute.For<DbSet<T>, IQueryable<T>>();
mockSet.AsNoTracking().Returns(mockSet);
if (data != null) {
var queryable = data.AsQueryable();
// setup all IQueryable methods using what you have from "data"
((IQueryable<T>)mockSet).Provider.Returns(data.Provider);
((IQueryable<T>)mockSet).Expression.Returns(data.Expression);
((IQueryable<T>)mockSet).ElementType.Returns(data.ElementType);
((IQueryable<T>)mockSet).GetEnumerator().Returns(data.GetEnumerator());
}
return mockSet;
}
}
static IQueryable<Customer> data;
[SetUp]
public void Init() {
data = new List<Customer> {
new Customer {
CUSTOMER = "333",
CUSTOMERNAME = "no name"
},
new Customer {
CUSTOMER = "555",
CUSTOMERNAME = "test name"
}
}.AsQueryable();
}
[Test]
public void Add_Should_AddGenericT() {
var mockSet = NSubstituteUtils.CreateMockDbSet<Customer>(data);
var mockContext = Substitute.For<MyEntities>();
mockContext.Set<Customer>().Returns(mockSet);
var repo = new GenericDataRepository<Customer, MyEntities>(mockContext);
var customer = new Customer {
CUSTOMER1 = "123",
CUSTOMERNAME = "test name"
};
var result = repo.Add(customer); // issue here: result returns null which should be a Customer
repo.Save();
var customerList = repo.GetAll().ToList();
Assert.AreEqual(3, customerList.Count); // failed. Expected 3 but was 2
}
あなたの 'Customer'タイプは、対応するエンティティタイプと一致しますか? –
私は 'Customer'のすべてのプロパティを含んでいませんでした。フィールドの一部はnullにできません。しかし、 'repo.Save()'は例外をスローしませんでした。 – Firefly
申し訳ありませんが、明確にするために、 'Customer'タイプは、エンティティフレームワークのテーブルにマップされているものと同じタイプでなければなりません。あなたのコンテキストをどのようにマップしましたか? Database-FirstまたはCode-Firstを使用していますか? –