2017-06-08 25 views
1

私は私のプロジェクトで、true \ falseを返す関数をいくつか持っています。私はユニットテストでそれらをテストしようとしています。単体テストc#とdbコンテキスト

public class DbContextDal : DbContext 
{ 

    public DbContextDal() : base("BdContextDal_ConnectionString_appConfig3") 
    { 
     Configuration.LazyLoadingEnabled = true; 
    } 

    public virtual DbSet<User> users { get; set; } 
    public virtual DbSet<Student> students { get; set; } 
    public virtual DbSet<Course> courses { get; set; } 
    public virtual DbSet<Enrollment> Enrollments { get; set; } 
    } 

ご覧のとおり、DbContextCalはデータベースへの接続であり、値を返す関数がいくつかあります。 ここで私は私がgetGradeInCourseと私はそのためのユニットテストをしました。この機能をテストしたい私はユニットテスト

public class Student 
{ 
    // variables of this student.. 
public float getGradeInCourse(Course c) 
    { 
     if (s == null || c == null) return -1f; 

     float grade = -1f; 
     DbContextDal dal = new DbContextDal(); 
     Enrollment e = dal.Enrollments.Find(s.ID, c.ID); 
     if (e != null) 
      grade = e.Grade; 
     return grade; 
    } 
} 

のためにしたクラスでそれをテストしようとしている:

[TestClass()] 
public class StudentTests 
{ 
    [TestMethod()] 
    public void getGradeInCourseTest() 
    { 
     DbContextDal dal = new DbContextDal(); 
     Student s = dal.students.Find(100); 
     Course c = dal.courses.Find(900); 

     Assert.AreEqual(s.getGradeInCourse(c), 76); 
    } 
} 

私はこれを取得していますエラー:

An exception of type 'System.InvalidOperationException' occurred in EntityFramework.dll but was not handled in user code 

Additional information: Migrations is enabled for context 'DbContextDal' but the database does not exist or contains no mapped tables. Use Migrations to create the database and its tables, for example by running the 'Update-Database' command from the Package Manager Console. 

このDBコンテキストでは、ほとんど私のプロジェクトの各機能で使用します。 私はこのオブジェクトDbcontextを何度も使っているので、私はMockで使うことができません。例えば、上記のテストを試みた関数です。

+1

私はあなたがコントロールと依存関係注入の逆転を検討するワンだと思います。あるいは、あなたのテストが実際のデータベースに当たって欲しいのですか? (これはそう思わない)。あなたがテストしているもの(例えば、GetGradeInCourse())は、実際のデータベースにぶつかってはならない。 – Stuart

+0

はい、実際のデータベースにヒットしたいのは、自分のプロジェクトを正しく計画していないからです。 –

答えて

1

DBをフレームワークでモックすることができます。実際のデータベースを使用する代わりに、模擬テストの動作を変更してテストに合格するだけです。 私は例えば、このためにTypemockアイソレータを使用しています:

[TestMethod,Isolated] 
public void TestMethod1() 
{ 
    var fakeDBContextDal = Isolate.Fake.NextInstance<DbContextDal>(); 
    var s = new Student(); 
    var c = new Course(); 
    s.ID = 1; 
    c.ID = 2; 

    var e = new Enrollment(); 
    e.Grade = 100; 

    Isolate.WhenCalled(() => fakeDBContextDal.Enrollments.Find(1,2)).WithExactArguments().WillReturn(e); 

    Assert.AreEqual(s.getGradeInCourse(c), 100); 
}