C# 我的MVC控制器测试是否应返回<;空的>;数据库中的对象?我做错什么了吗?
我正在测试一些MVC控制器。我对这种特殊的测试方法比较陌生。当我模拟控制器和方法属性,然后执行该方法时,该方法返回C# 我的MVC控制器测试是否应返回<;空的>;数据库中的对象?我做错什么了吗?,c#,database,unit-testing,mocking,fakeiteasy,C#,Database,Unit Testing,Mocking,Fakeiteasy,我正在测试一些MVC控制器。我对这种特殊的测试方法比较陌生。当我模拟控制器和方法属性,然后执行该方法时,该方法返回。所以要么它应该这样做,要么我没有连接到数据库。我在app.config文件中添加了一些连接字符串和数据源,但运气不好。仍然返回 我的App.Config文件(代码段) 我的测试-在调用Assert.arame而不是.AreEqual时返回 [Test] public void GetContacts_ReturnContacts() { //Arrange va
。所以要么它应该这样做,要么我没有连接到数据库。我在app.config文件中添加了一些连接字符串和数据源,但运气不好。仍然返回
我的App.Config文件(代码段)
我的测试-在调用Assert.arame而不是.AreEqual时返回
[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);
}
}
[测试]
public void GetContacts_ReturnContacts()
{
//安排
var mockContactManager=A.Fake();
var mockContext=A.Fake();
var mockCallerInfoManager=A.Fake();
var mockSiteRepository=A.Fake();
var mockContactController=A.Fake();
mockContext.SiteLocationCode=“US1”;
const int mockContactId=168;
mockContext.ContactId=mockContactId;
List expected=新列表{};//我们希望得到什么
A.CallTo(()=>mockContactManager.GetContacts(mockContext.SiteLocationCode)).Returns(预期);
使用(mockContactController=新的ContactController(mockContactManager、mockCallerInfoManager、mockSiteRepository))
{
//表演
List returnedContacts=mockContactController.GetContacts();
//断言
Assert.AreEqual(预期、返回的联系人);
}
}
我的控制器
[HttpPost]
[ActionName("RetrieveContacts")]
public List<Contact> GetContacts([FromBody]string query)
{
var context = GetContext();
return _contactManager.GetContacts(context.SiteLocationCode, query);
}
[HttpPost]
[ActionName(“RetrieveContacts”)]
公共列表GetContacts([FromBody]字符串查询)
{
var context=GetContext();
返回_contactManager.GetContacts(context.SiteLocationCode,查询);
}
不确定要测试什么。如果模拟接口,它将不使用指定的任何数据库连接字符串。它是一个伪类,模拟接口而不做任何实际工作,只是为了传递给期望对象类型的函数。如果您想使用真实数据库,则不要使用模拟。不确定您要测试什么。如果模拟接口,它将不使用指定的任何数据库连接字符串。它是一个伪类,模拟接口而不做任何实际工作,只是为了传递给期望对象类型的函数。如果您想使用真实数据库,请不要使用模拟。谢谢!这回答了很多问题。很好的解释。我正在尝试测试“GetContacts”控制器方法--我是新来的,我做对了吗?谢谢GetContacts方法中确实没有逻辑,所以似乎没有什么可测试的。创建连接到数据库的实际IContactManager实例并将其与实际存储库实现一起传递给ContactController实例是有意义的。但是,如果您确实计划在GetContacts方法中使用逻辑,那么您可以使用mock,但请确保模拟存储库的方法以返回某种类型的数据(无需连接到数据库)。谢谢!这回答了很多问题。很好的解释。我正在尝试测试“GetContacts”控制器方法--我是新来的,我做对了吗?谢谢GetContacts方法中确实没有逻辑,所以似乎没有什么可测试的。创建连接到数据库的实际IContactManager实例并将其与实际存储库实现一起传递给ContactController实例是有意义的。但是,如果您确实计划在GetContacts方法中使用逻辑,那么您可以使用mock,但请确保模拟存储库的方法以返回某种类型的数据(不连接到数据库)。