【问题标题】:AutoMapper Mocking UnitOfWork failingAutoMapper 模拟 UnitOfWork 失败
【发布时间】:2016-06-05 11:09:28
【问题描述】:

我正在尝试模拟 UnitOfWork,但我需要一些帮助,因为我无法正确实现我的结果

所以我有以下 BooksController:-

public class BooksController : BaseController
{
    private IUnitOfWork UnitOfWork;

    public BooksController()
    {
        UnitOfWork = new UnitOfWork();
    }

    public BooksController(IUnitOfWork unitOfWork)
    {
        UnitOfWork = unitOfWork;
    }

    // GET: api/Books
    public IQueryable<BookDTO> GetBooks()
    {
        return UnitOfWork.BookRepository.GetBooks("").ProjectTo<BookDTO>();
    }
    ...................

以下 BooksRepository:-

public class BooksRepository : IBooksRepository
{
    internal BookContext Context = new BookContext();
    internal DbSet<Book> dbSet;

    public BooksRepository(BookContext context)
    {
        Context = context;
        dbSet = context.Set<Book>();
    }

    public virtual IQueryable<Book> GetBooks(string includeProperties = "")
    {

        IQueryable<Book> query = dbSet;

        foreach (var includeProperty in includeProperties.Split
            (new[] { ',' }, StringSplitOptions.RemoveEmptyEntries))
        {
            query = query.Include(includeProperty);
        }

        return query;
    }
    ...........................

工作单元:-

public class UnitOfWork : IDisposable, IUnitOfWork
{
    private readonly BookContext _context = new BookContext();
    private IBooksRepository _booksRepository;

    public IBooksRepository BookRepository
    {
        get
        {
            if (_booksRepository == null)
            {
                _booksRepository = new BooksRepository(_context);
            }
            return _booksRepository;
        }

    }
    .........................

在 Global.asax 我有:-

AutoMapperConfig.RegisterMappings();

AutoMapperConfig 如下:-

public static class AutoMapperConfig
{
    public static void RegisterMappings()
    {
        Mapper.Initialize(x =>
        {
            x.AddProfile<BookMappings>();
        });
    }
}

还有 BookMappings :-

public class BookMappings : Profile
{
    public override string ProfileName => "BookMappings";

    protected override void Configure()
    {
        CreateMap<Book, BookDTO>();
        CreateMap<Book, BookDTO>()
            .ForMember(dest => dest.BookTitle,
                opts => opts.MapFrom(src => src.Title));
        CreateMap<Book, BookDTO>()
            .ForMember(dest => dest.AuthorName,
                opts => opts.MapFrom(src => src.Author.Name));

        CreateMap<Book, BookDetailDTO>();
        CreateMap<Book, BookDetailDTO>()
            .ForMember(dest => dest.BookTitle,
                opts => opts.MapFrom(src => src.Title));
        CreateMap<Book, BookDetailDTO>()
            .ForMember(dest => dest.AuthorName,
                opts => opts.MapFrom(src => src.Author.Name));
        CreateMap<Book, BookDetailDTO>()
            .ForMember(dest => dest.GenreType,
                opts => opts.MapFrom(src => src.Genre.Type));
    }
}

最后是我希望运行的测试:-

[TestFixture]
public class BooksControllerTests
{
    private Mock<IUnitOfWork> _unitOfWorkMock;
    private Mock<IBooksRepository> _booksRepositoryMock;
    BooksController objController;
    List<Book> books = new List<Book>();

    [SetUp]
    public void Setup()
    {
        _unitOfWorkMock = new Mock<IUnitOfWork>();
        _booksRepositoryMock = new Mock<IBooksRepository>();
        _unitOfWorkMock.Setup(x => x.BookRepository)
            .Returns(_booksRepositoryMock.Object);
        objController = new BooksController(_unitOfWorkMock.Object);
        AutoMapperConfig.RegisterMappings();

        books = new List<Book>()
        {
            new Book {Id = 1, Title = "Hamlet", ISBN = 1853260096, AuthorId = 1, GenreId = 1, IsAvailable = true, Summary = "Hamlet is not only one of Shakespeare's greatest plays, but also the most fascinatingly problematical tragedy. "},
            new Book {Id = 2, Title = "Macbeth", ISBN = 1853260355, AuthorId = 1, GenreId = 1, IsAvailable = true, Summary = "Shakespeare’s Macbeth is one of the greatest tragic dramas the world has known. "},
            new Book {Id = 3, Title = "Romeo And Juliet", ISBN = 1840224339, AuthorId = 1, GenreId = 2, IsAvailable = true, Summary = "Romeo and Juliet is the world's most famous drama of tragic young love. "}
        };
    }

    [Test]
    public void Get_Post_Should_Get_All_Books()
    {
        // Arrange
        _booksRepositoryMock.Setup(x => x.GetBooks(""))
                            .Returns(books.AsQueryable());

        // Act
        var result = objController.GetBooks().ToList();

        // Assert
        Assert.AreEqual(result.Count, 3);
    }
}

我希望将我在测试中创建的模拟列表传递给 BooksController 并验证我得到了 3 个结果,但是我没有设法做到这一点。

目前它在 Get_Post_Should_Get_All_Books() 的行为上失败了 它似乎没有找到 Automapper 并给出以下错误:-

System.NullReferenceException : 对象引用未设置为对象的实例。

在 lambda_method(Closure , Book ) 在 System.Linq.Enumerable.WhereSelectListIterator2.MoveNext() at System.Collections.Generic.List1..ctor(IEnumerable1 collection) at System.Linq.Enumerable.ToList[TSource](IEnumerable1 源)

任何帮助将不胜感激。谢谢!

【问题讨论】:

    标签: c# unit-testing mocking tdd moq


    【解决方案1】:

    您忘记配置您的假 UoW(_unitOfWorkMock) 以返回存储库。

    将以下行添加到您的排列或设置方法中:

     _unitOfWorkMock.Setup(x => x.BookRepository)
                    .Returns(_booksRepositoryMock.Object);
    

    【讨论】:

    • 我已将其添加到设置中,但是我得到的对象未设置为 Act 上的对象实例 -- var result = objController.GetBooks().ToList();跨度>
    • @Johann ,我把代码拿进了VS; UnitOfWork.BookRepository.GetBooks("") 给了我预期的列表....所以问题出在您的 Automapper 配置上; .ProjectTo&lt;BookDTO&gt;();。也许你没有初始化它......
    • 我在 Arrange now 中初始化了这个 AutoMapperConfig.RegisterMappings();但仍然收到错误
    • GetBooks 的堆栈跟踪如下所示:-“在 lambda_method(Closure, Book)\r\n 在 System.Linq.Enumerable.WhereSelectListIterator2.MoveNext()\r\n at System.Linq.SystemCore_EnumerableDebugView1.get_Items()”跨度>
    • 但是是的,我确认它的 AutoMapper 不起作用,因为删除 ProjectTo 可以正常工作。我没有用 AutoMapperConfig.RegisterMappings() 很好地初始化它吗?
    【解决方案2】:

    在阅读了一些不建议使用 Automapper 尤其是 TDD 的帖子后,我决定完全删除 Automapper。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-11-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-13
      • 2016-06-27
      • 2010-10-10
      • 1970-01-01
      相关资源
      最近更新 更多