我的MVC Controller测试应该从数据库返回<empty>对象吗?我做错了吗?

时间:2016-01-24 20:19:37

标签: c# database unit-testing mocking fakeiteasy

我正在测试一些MVC控制器。我对这种特殊的测试方法比较陌生。当我模拟控制器和方法属性,然后执行该方法时,该方法返回<empty>。所以要么它应该这样做,要么我没有连接到数据库。我在app.config文件中添加了一些连接字符串和数据源,但没有运气。仍然会返回<empty>

我的App.Config文件(摘录)

<connectionStrings>
<!-- <add name="DbContexy" providerName="System.Data.SqlClient" connectionString="Persist Security Info=False;User ID=user;Password=Password;Initial Catalog=Db;Data Source=MySource" />-->
<!-- Inserted Connection String Below -->
<add name="DbContext" providerName="System.Data.SqlClient" connectionString="user id=User;password=hello;Data Source=exampleSource;Database=MyDb" />
<!--<add name="DbContext" providerName="System.Data.SqlClient" connectionString="Persist Security Info=False;User ID=user;Password=password;Initial Catalog=Sb;Data Source=.\MySource" />-->
</connectionStrings>

我的测试 - 当Assert.AreSame被称为.AreEqual的INSTEAD时返回<empty>

[Test]
public void GetContacts_ReturnContacts()
{
    //Arrange
    var mockContactManager = A.Fake<IContactManager>();
    var mockContext = A.Fake<CallerInfo>();
    var mockCallerInfoManager = A.Fake<ICallerInfoManager>();
    var mockSiteRepository = A.Fake<ISiteRepository>();
    var mockContactController = A.Fake<ContactController>();
    mockContext.SiteLocationCode = "US1";
    const int mockContactId = 168;

mockContext.ContactId = mockContactId;

List<Contact> expected = new List<Contact> { }; // What we expect to get back

A.CallTo(() => mockContactManager.GetContacts(mockContext.SiteLocationCode)).Returns(expected);

using (mockContactController = new ContactController(mockContactManager, mockCallerInfoManager, mockSiteRepository))
{
    //Act
    List<Contact> returnedContacts = mockContactController.GetContacts();

    //Assert
Assert.AreEqual(expected, returnedContacts);
    }
    }

我的控制器

  [HttpPost]
    [ActionName("RetrieveContacts")]
    public List<Contact> GetContacts([FromBody]string query)
    {
        var context = GetContext();           
        return _contactManager.GetContacts(context.SiteLocationCode, query);
    }

1 个答案:

答案 0 :(得分:2)

不确定您要测试的是什么。如果您模拟了接口,则不会使用您指定的任何数据库连接字符串。它是一个虚假的类,它模仿界面而不做任何实际工作,因此你可以传递给期望对象类型的函数。如果你想使用真正的数据库,那就不要使用模拟。