我正在尝试对我的ASP MVC应用程序进行单元测试,但我的测试失败并显示消息Message: Assert.AreEqua failed. Expected:<>. Actual: <Error>
。
现在,我认为这是因为我把测试设置错了,但我找不到可能错过的地方。任何提示将不胜感激。我正在使用Moq。
我的测试班:
[TestClass]
public class ErrorControllerTest
{
[TestMethod]
public void TestErrorView()
{
var repositoryMock = new Mock<IErrorRepository>();
var errors = new List<ErrorModel>();
errors.Add(new ErrorModel()
{
Id = "id",
Message = "message"
});
repositoryMock.Setup(r => r.GetErrors()).Returns(errors);
var controller = new ErrorController(repositoryMock.Object);
var result = (ViewResult) controller.Error(1);
Assert.AreEqual(result.ViewName, "Error");
repositoryMock.VerifyAll();
}
}
为了更好地衡量,这是受测试的控制器:
public class ErrorController : Controller
{
private readonly IErrorRepository errorRepository;
public ErrorController(IErrorRepository errorRepository)
{
this.errorRepository = errorRepository;
}
public ActionResult Error(int? page)
{
var errors = errorRepository.GetErrors();
//// stuff for paging
int pageSize = 10;
int pageNumber = (page ?? 1); // if there is no page, return page 1
return View(errors.ToPagedList(pageNumber, pageSize));
}
}
存储库:
public interface IErrorRepository
{
List<ErrorModel> GetErrors();
}
public class ErrorRepository : IErrorRepository
{
public ErrorModel Errors { get; set; }
public List<ErrorModel> ErrorList { get; set; }
public List<ErrorModel> GetErrors()
{
string cs = "Data Source=" + "some path";
using (SQLiteConnection con = new SQLiteConnection(cs))
{
var listOfErrors = new List<ErrorModel>();
string stm = "SELECT * FROM Error";
con.Open();
using (SQLiteCommand cmd = new SQLiteCommand(stm, con))
{
using (SQLiteDataReader rdr = cmd.ExecuteReader())
{
while (rdr.Read())
{
listOfErrors.Add(new ErrorModel
{
Id = rdr["ID"].ToString(),
Message = rdr["Message"].ToString()
});
}
rdr.Close();
ErrorList = listOfErrors;
}
}
con.Close();
}
return ErrorList;
}
}
答案 0 :(得分:1)
使用Assert.AreEqual()时,应始终先将预期的值,然后是实际值,否则结果会让人感到困惑。你的测试意味着什么是result.ViewName是空的,当它期望它是&#34;错误&#34;。你的配置是正确的(除了那个小小的麻烦),它突出了a)代码中某个地方的错误,或者b)你认为结果.ViewName应该是&#34;错误&#34;是不正确的。
答案 1 :(得分:1)
我不知道您从result.ViewName
获得的结果是什么,但它应该等于文本"Error"
以使您的测试通过。否则,您应该将"Error"
更改为实际结果,并将result.ViewName
更改为预期结果。
Assert.AreEqual(result.ViewName, "Error");
请记住:Assert.AreEqual(
预期结果,实际结果 );
如果您仍然感到困惑,请参阅下面的示例代码,以便您查看更清晰的视图。
这是我的预期结果:
http://prntscr.com/8p0r03
这是我的实际结果: http://prntscr.com/8p0qnj