ASP MVC测试断言“预期<>”意外

时间:2015-10-08 07:41:24

标签: c# asp.net-mvc unit-testing moq

我正在尝试对我的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;
    }
}

2 个答案:

答案 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