0

我正在尝试使用 ASP.NET MVC 在 VS2012 Web Express 中使用测试项目来测试辅助方法。我不想使用我的常规数据库进行测试,所以我在测试项目中添加了以下 App.Config:

<connectionStrings>
     <add name="MyConnection" connectionString="Data Source=(LocalDB)\v11.0;AttachDbFilename=|DataDirectory|\UnitTest.mdf;Integrated Security=True" providerName="System.Data.SqlClient" />
</connectionStrings>

设置我的单元测试看起来像这样:

[TestMethod]
public void TestSomething()
{
    MyDatabase db = new MyDatabase();

    //Initialize objects and save them in the (test) database

    db.SaveChanges();

    //Initializing the class that contains the method I want to test
    TestUserClass tuc= new TestUserClass();

    //Calling the method I want to test
    tuc.TestUserMethod (1, 1);

    //Check the database if everything is correct
}

这工作正常,我正在使用我的测试数据库并创建了所有正确的对象。但是,当我初始化包含我要测试的方法的类时,问题就来了。由于 TestUserClass 也使用数据库,它也像这样初始化数据库

//In the class TestUserClass 
MyDatabase db = new MyDatabase();

MyDatabase 类看起来像这样:

public class MyDatabase : DbContext
{
    public MyDatabase()
        : base("MyConnection")
    {
        Database.SetInitializer<MyDatabase>(new DropCreateDatabaseIfModelChanges<MyDatabase>());
    }

    public DbSet<UserGroup> UserGroups { get; set; }
}

一旦我初始化要测试的类,就会出现问题。在此之前,我的 db 对象包含所有正确的对象,但是在我初始化我的 TestUserClass 并因此创建另一个 MyDatabase 对象之后,db 对象不包含任何内容(所有正确的集合都在那里,它们只是空的)。

我假设问题是我再次初始化了 MyDatabase 对象(显然?)。但我不确定如何解决这个问题。这是我的应用程序设计、单元测试的问题,还是我只是错过了一些愚蠢的小代码,允许我在不初始化数据库的情况下使用数据库并因此重置对象?

最好的问候,并在此先感谢您!

安德烈亚斯

4

1 回答 1

0

回答我自己的问题(我不知道它实际上是如何工作的,试错 FTW)。我向 TestUserClass 添加了一个重载的构造函数:

public UserManagement()
{
   db = new RefusionsDatabase();
}

public UserManagement(RefusionsDatabase dbIn)
{
   db = dbIn;
}

并将 TestUserClass 的初始化移到 MyDatabase 初始化之后(不知道为什么这是必要的,但确实如此)。

MyDatabase db = new MyDatabase();
TestUserClass tuc= new TestUserClass(db);

现在它可以工作了。

希望它可以帮助某人

安德烈亚斯

PS:如果有人知道为什么会这样,知道更好的解决方案或对设计发表评论,我会很高兴,因为没有解释就很奇怪。

于 2013-06-07T20:26:21.007 回答