C# 自动映射模拟工作单元失败

C# 自动映射模拟工作单元失败,c#,unit-testing,mocking,tdd,moq,C#,Unit Testing,Mocking,Tdd,Moq,我试图模仿UnitOfWork,但是我需要一些帮助,因为我没有正确地实现我的结果 因此,我有以下几个问题:- public class BooksController : BaseController { private IUnitOfWork UnitOfWork; public BooksController() { UnitOfWork = new UnitOfWork(); } public BooksController(IU

我试图模仿UnitOfWork,但是我需要一些帮助,因为我没有正确地实现我的结果

因此,我有以下几个问题:-

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>();
    }
    ...................
在Global.asax中,我有:-

AutoMapperConfig.RegisterMappings();
自动映射配置如下所示:-

public static class AutoMapperConfig
{
    public static void RegisterMappings()
    {
        Mapper.Initialize(x =>
        {
            x.AddProfile<BookMappings>();
        });
    }
}
公共静态类AutoMapperConfig
{
公共静态无效注册表映射()
{
Mapper.Initialize(x=>
{
x、 AddProfile();
});
}
}
以及图书映射:-

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));
    }
}
公共类BookMappings:Profile
{
公共重写字符串ProfileName=>“BookMappings”;
受保护的覆盖无效配置()
{
CreateMap();
CreateMap()
.ForMember(dest=>dest.BookTitle,
opts=>opts.MapFrom(src=>src.Title));
CreateMap()
.ForMember(dest=>dest.AuthorName,
opts=>opts.MapFrom(src=>src.Author.Name));
CreateMap();
CreateMap()
.ForMember(dest=>dest.BookTitle,
opts=>opts.MapFrom(src=>src.Title));
CreateMap()
.ForMember(dest=>dest.AuthorName,
opts=>opts.MapFrom(src=>src.Author.Name));
CreateMap()
.FormMember(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);
    }
}
[TestFixture]
公共类图书管理员测试
{
私人模拟(unitOfWorkMock),;
私人模拟书店;
图书控制器对象控制器;
列表书籍=新列表();
[设置]
公共作废设置()
{
_unitOfWorkMock=新建Mock();
_booksRepositoryMock=新建Mock();
_unitOfWorkMock.Setup(x=>x.BookRepository)
.Returns(_booksRepositoryMock.Object);
objController=newbookscontroller(_unitOfWorkMock.Object);
AutoMapperConfig.RegisterMappings();
图书=新列表()
{
新书{Id=1,Title=“哈姆雷特”,ISBN=185326096,authord=1,GenreId=1,IsAvailable=true,Summary=“哈姆雷特不仅是莎士比亚最伟大的戏剧之一,也是最令人着迷的问题悲剧。”,
新书{Id=2,Title=“麦克白”,ISBN=1853260355,authord=1,GenreId=1,IsAvailable=true,Summary=“莎士比亚的《麦克白》是世界上已知的最伟大的悲剧之一。”,
新书{Id=3,Title=“罗密欧与朱丽叶”,ISBN=1840224339,authord=1,GenreId=2,IsAvailable=true,Summary=“罗密欧与朱丽叶是世界上最著名的年轻爱情悲剧。”
};
}
[测试]
公共无效获取发布应该获取所有书籍()
{
//安排
_booksRepositoryMock.Setup(x=>x.GetBooks(“”)
.Returns(books.AsQueryable());
//表演
var result=objController.GetBooks().ToList();
//断言
Assert.AreEqual(result.Count,3);
}
}
我希望将我在测试中创建的模拟列表传递给BooksController,并验证我是否返回了3个结果,但是我没有做到这一点

目前,它在获取所有书籍的行为上失败了 它似乎没有找到自动映射器,并给出以下错误:-

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

在lambda_法(闭包,书本) 在System.Linq.Enumerable.WhereSelectListIterator
2.MoveNext()中
位于System.Collections.Generic.List
1..ctor(IEnumerable
1集合)
at System.Linq.Enumerable.ToList[t源](IEnumerable
1源)


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

您忘记配置伪UoW(
\u unitOfWorkMock
)以返回存储库

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

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

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

我在设置中添加了一个内容,但是我得到的对象并没有设置为Act上的对象实例--var result=objController.GetBooks().ToList()@约翰,我把代码带进了VS<代码>UnitOfWork.BookRepository.GetBooks(“”)为我提供了预期的列表。。。。因此,问题在于您的Automapper配置,因为<代码>.ProjectTo()。可能您没有初始化它…我在Arrange now AutoMapperConfig.RegisterMappings()中初始化了它;但是仍然得到错误GetBooks的堆栈跟踪如下所示:-“在lambda_方法(闭包,Book)\r\n在System.Linq.Enumerable.WhereSelectListIterator
2.MoveNext()\r\n在System.Linq.SystemCore_EnumerableDebugView
1.get\u Items()”但是是的,我确认它是自动映射器,它不工作,因为移除项目可以正常工作。我用AutoMapperConfig.RegisterMappings()初始化的不是很好吗?
[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);
    }
}
 _unitOfWorkMock.Setup(x => x.BookRepository)
                .Returns(_booksRepositoryMock.Object);