【问题标题】:Entity Framework, Generic Repositories, and Unit Testing实体框架、通用存储库和单元测试
【发布时间】:2012-04-18 18:40:59
【问题描述】:

我解决了我的问题,但我不确定为什么事情会这样,我一直在问,因为我一直想知道为什么事情会以他们的方式运行。

好的,我正在开发一个 MVC 3 应用程序,它使用通用存储库、用于 DI 的统一和用于单元测试的最小起订量。在我编辑项目的单元测试中,我的控制器最初具有以下内容: AnEntity obj = _anEntityService.GetById(id);

但是,当我的单元测试在控制器中调用 Edit(1) 时,会返回 null。当我将阅读更改为 AnEntity obj = _anEntityService.GetAll().FirstOrDefault(p => p.Id == id);

它正确返回了模拟项目。

现在,我很高兴我弄明白了,但是,我仍然不明白为什么这对单元测试有效,但 GetById 在我运行应用程序时正在工作。

任何见解都会很有帮助。

提前致谢。

这是模拟的数据:

public class AdministrationMockData
{
    #region Administration Mock Data
    #region County Mock Data
    public static void CreateCounty(ref Mock<ICountyService> mock)
    {
        mock.Setup(m => m.GetAll()).Returns(new List<County> 
        {
    new County { Id = 1, Name = "Adams", StateId = 39, IsActive = true, LastChangedDate = DateTime.Now, LastChangedBy = "dba", AddedDate = DateTime.Now, AddedBy = "dba" },
    new County { Id = 2, Name = "Berks",  StateId = 39, IsActive = true, LastChangedDate = DateTime.Now, LastChangedBy = "dba", AddedDate = DateTime.Now, AddedBy = "dba" },
    new County { Id = 3, Name = "Chester",  StateId = 39, IsActive = true, LastChangedDate = DateTime.Now, LastChangedBy = "dba", AddedDate = DateTime.Now, AddedBy = "dba" },
    new County { Id = 4, Name = "York",  StateId = 39, IsActive = true, LastChangedDate = DateTime.Now, LastChangedBy = "dba", AddedDate = DateTime.Now, AddedBy = "dba" },
    new County { Id = 5, Name = "Baltimore",  StateId = 21, IsActive = true, LastChangedDate = DateTime.Now, LastChangedBy = "dba", AddedDate = DateTime.Now, AddedBy = "dba" },
    new County { Id = 6, Name = "Montgomery",  StateId = 21, IsActive = true, LastChangedDate = DateTime.Now, LastChangedBy = "dba", AddedDate = DateTime.Now, AddedBy = "dba" }
  }.AsQueryable());
    }
    #endregion County Mock Data

    #region State Mock Data
    public static void CreateState(ref Mock<IStateService> mock)
    {
        mock.Setup(m => m.GetAll()).Returns(new List<State> 
        {
    new State { Id = 21, Name = "Maryland", Code = "MD", IsActive = true, LastChangedDate = DateTime.Now, LastChangedBy = "dba", AddedDate = DateTime.Now, AddedBy = "dba" },
    new State { Id = 39, Name = "Pennsylvania",  Code = "PA", IsActive = true, LastChangedDate = DateTime.Now, LastChangedBy = "dba", AddedDate = DateTime.Now, AddedBy = "dba" }        
  }.AsQueryable());
    }
    #endregion State Mock Data
    #endregion Administration Mock Data
}

这是编辑单元测试

    [TestMethod]
    public void Can_Edit_County()
    {
        // Arrange
        // - create the mock repositories
        Mock<ICountyService> mockCounty = new Mock<ICountyService>();
        Mock<IStateService> mockState = new Mock<IStateService>();
        AdministrationMockData.CreateCounty(ref mockCounty);
        AdministrationMockData.CreateState(ref mockState);

        // Arrange
        // - create a controller and make the page size 6 items
        CountyController controller = new CountyController(mockCounty.Object, mockState.Object);
        controller.PageSize = 6;
        controller.Testing = true;

        // Act
        County c1 = controller.Edit(1).ViewData.Model as County;
        County c2 = controller.Edit(2).ViewData.Model as County;
        County c3 = controller.Edit(3).ViewData.Model as County;

        // Assert
        Assert.AreEqual(1, c1.Id);
        Assert.AreEqual(2, c2.Id);
        Assert.AreEqual(3, c3.Id);
    }

这是控制器编辑例程:

    public ViewResult Edit(int id)
    {
        //County obj = _countyService.GetById(id);
        County obj = _countyService.GetAll().FirstOrDefault(p => p.Id == id);
        if (!Testing)
        {
            PopulateCountyDropDownLists(obj.StateId);
        }
        return View(obj);
    }

我有一个通用存储库和接口存储库,它由 TEntity 为每个特定实体实例化,并且还有一个服务和接口服务来执行存储库。我的存储库和服务基于:http://efmvc.codeplex.com/releases/view/58663

【问题讨论】:

  • 我不会称之为解决问题。您正在下载所有项目并在客户端执行过滤,这将影响您的应用程序性能。无论如何,您能否分享一下您在测试中用于配置模拟的代码?
  • 如何模拟数据?您是否正确设置了 ID?就像 dmusial 所说,代码会很有帮助。

标签: asp.net-mvc-3 unit-testing repository moq


【解决方案1】:

你得到 null 因为你从来没有设置你的 CountyService 在调用 GetById 时返回正确的数据。添加下面的代码来设置模拟,你会很好地使用GetById 方法:

mock.Setup(m => m.GetById(1).Returns(new State { Id = 1, ... });

或将其设置为与传递给方法的任何参数一起使用:

mock.Setup(m => m.GetById(It.IsAny<int>()).Returns(new State { ... });

【讨论】:

  • 太棒了,做到了。只是进入单元测试的事情,因为它很重要。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-17
  • 1970-01-01
  • 1970-01-01
  • 2017-07-03
  • 2012-02-02
  • 2023-04-09
相关资源
最近更新 更多