1
下面是我的一个单元测试类(简化为基础知识)的示例。在控制器中,当调用Index()操作方法时,对GetByID(1234)的调用总是会生成一个Ticket对象的新实例。该对象存在,但它的所有属性都是null,即使我已将它们设置在我的假对象中。任何想法为什么?模拟知识库返回具有空属性的对象
我正在使用Moq。
单元测试
[TestClass]
public class TicketControllerTests : ControllerTestBase
{
protected Mock<ITicketRepository> MockTicketRepository = new Mock<ITicketRepository>();
[TestMethod]
public void IndexActionModelIsTypeOfTicketModel()
{
//ARRANGE
Mock<HttpContextBase> context = FakeHttpContext();
context.Setup(ctx => ctx.Session[SessionKeys.TokenData.ToString()]).Returns(Constants.TOKENDATA_SUBMITTER);
MockTicketRepository.Setup(x => x.GetById(It.IsAny<int>())).Returns(Constants.CLIENT_TICKET);
//ACT
var result = GetController(context.Object).Index(Constants.TICKET_ID);
var model = ((ViewResult)result).Model;
//ASSERT
Assert.IsInstanceOfType(model, typeof(TicketModel), "ViewModel should have been an instance of TicketModel.");
}
private TicketController GetController(HttpContextBase context)
{
var controller = new TicketController(MockTicketRepository.Object);
controller.ControllerContext = GetControllerContext(context, controller);
return controller;
}
}
Constants.CLIENT_TICKET
public static Ticket CLIENT_TICKET
{
get
{
var ticket = new Ticket
{
CategoryID = 1,
CreatedByUserId = 4
};
ticket.Clients.Add(new Client { ShortName = "Test Client 1"});
ticket.Clients.Add(new Client { ShortName = "Test Client 2" });
ticket.User = new User {FirstName = "First", LastName = "Last"};
return ticket;
}
}
控制器
private readonly ITicketRepository _ticketRepository;
public TicketController(ITicketRepository ticketRepository)
{
_ticketRepository = ticketRepository;
}
public ActionResult Index(int id)
{
var ticket = _ticketRepository.GetById(id);
// etc...
}
我粘贴的一些代码是只是为了让它工作而玩弄的结果。但是,使用Constants.TICKET_ID不起作用。请参阅我几分钟前编写的代码编辑。即使在单元测试中调用Setup()之后,我也无法得到预期的对象,因此我认为它与控制器无关。但是,第一行(在一些警戒条款之后)是var ticket = _ticketRepository.GetById(id); – Scott
编辑中的代码按预期工作(无双关语意图)。如果您在模拟上创建了一个设置,然后检查对象属性,那么正在模拟的实际代码没有运行,所以模拟的实例不会包含任何内容。请记住,moq用于创建对真实对象的期望 - 它不会独立运行 – levelnis
啊,谢谢你。我仍然认为它不是控制器,就像我说的那样,没有什么奇特的事情发生,只是调用_ticketRepository.GetById(id),其中'id'来自路由值(并且是整数)。 – Scott