C# 自动映射模拟工作单元失败
我试图模仿UnitOfWork,但是我需要一些帮助,因为我没有正确地实现我的结果 因此,我有以下几个问题:-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
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.WhereSelectListIterator2.MoveNext()中
位于System.Collections.Generic.List
1..ctor(IEnumerable1集合)
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);