0

我是编写单元测试的初学者,并且我正在尝试进行测试。我将首先解释我要测试的内容。

我正在尝试测试一种将消息保存在 Mvc 4 项目中的方法。该方法被调用SaveMessage,如下所示。

namespace ChatProj.Service_Layer
{
    public class UserService : IUserService
    {
        public MessageContext messageContext = new MessageContext();

        public UserService()
        {
            _messageRepository = new MessageRepository(messageContext);
        }

        private  IMessageRepository _messageRepository;

    ->  public void SaveMessage(Message message)
        {
             messageContext.Messages.Add(message);
            _messageRepository.Save();
        }

该方法_messageRepository.SaveSaveMessage我的 DAL 层中实现,MessageRepository如下所示:

public void Save()
        {
            context.SaveChanges();
        }

这种保存方式似乎有点过于复杂,但我以这种方式构建项目,因为我不希望服务层 ( IUserService& UserService) 处理可以 & 应该 (我认为) 由数据访问层 ( IMessageRepository& MessageRepository)处理的操作.

现在是棘手的部分。我一直在尝试了解如何对此进行单元测试。这是我的尝试:

namespace ChatProj.Tests
{
    [TestFixture]
    class MessageRepositoryTests
    {
        [SetUp]
        public void Setup()
        {

        }

        [Test]
    public void SaveMessage_SaveWorking_VerifyUse()
    {
        //Arrange
        var userServiceMock = new Mock<UserService>();
        var message = new Message { MessageID = 0, Name = "Erland", MessageString = "Nunit Test", MessageDate = DateTime.Now };
        var repositoryMock = new Mock<IMessageRepository>();
        var contextMock = new Mock<MessageContext>();
        MessageRepository messageRepository = new MessageRepository(contextMock.Object);
        UserService userService = new UserService();

        //Act
        userService.SaveMessage(message);

        //Assert
        repositoryMock.Verify(m => m.Save());
        userServiceMock.Verify(m => m.SaveMessage(message));
    }
}

我收到此错误:Imgur link,我不太确定如何解决它。我已经尝试查看其他几个 SO 帖子,但我无法进行测试。

所以我想知道,我实际上如何让我的单元测试工作?

4

2 回答 2

2

您应该设置您的MessageContext属性以返回虚假数据,并且不要使用 SaveChanges 方法进行真正的 Db 调用。现在它仍然试图访问一个真正的数据库。

但是您只能设置虚拟属性,或者它是否是一个接口。

所以最好的解决方案是从你的接口中提取一个接口MessageContext并将其注入到存储库中。然后您可以轻松地模拟您的IMessageContext界面并强制它返回适当的内存数据。

于 2013-11-12T14:29:32.720 回答
1

看看这两行:

UserService userService = new UserService();

//Act
userService.SaveMessage(message);

您正在创建一个userService实例,然后立即保存您的消息。现在跳入SaveMessage代码。

public void SaveMessage(Message message)
{
     messageContext.Messages.Add(message);
    _messageRepository.Save();
}

好的,现在您正在向 中添加内容messageContext,然后调用_messageRepository.Save(). 但是在哪里实例messageContext_messageRepository

public MessageContext messageContext = new MessageContext();

public UserService()
{
    _messageRepository = new MessageRepository(messageContext);
}

您在实例化时创建它们。您在测试中创建的模拟没有被使用。您可以考虑将它们UserService作为参数传递给构造函数,而不是在构造函数中创建这些对象的实例。然后,您可以在测试中传入模拟实例。

于 2013-11-12T14:33:58.633 回答