Как настроить простой модульный тест с Moq? - PullRequest
3 голосов
/ 25 июня 2010

Я новичок в Moq и не совсем уверен, почему это не сработает.

Интерфейс репозитория

using System.Collections.Generic;

public interface IRepository
{
    IEnumerable<string> list();
}

Сервисный интерфейс

using System.Collections.Generic;

public interface IService
{
    IEnumerable<string> AllItems();
}

Класс обслуживания

using System.Collections.Generic;

public class Service : IService
{
    private IRepository _repository;

    public Service(IRepository repository)
    {
        this._repository = repository;
    }

    public IEnumerable<string> AllItems()
    {
        return _repository.list();
    }
}

Класс модульных испытаний

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Web.Mvc;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using MoqTest;
using MoqTest.Controllers;
using Moq;
using MoqTest.Models;

[TestClass]
public class Tests
{
    private Mock<IRepository> _mockRepository;
    private IService _service;

    [TestMethod]
    public void my_test()
    {
        //Arrange.
        List<string> theList = new List<string>();
        theList.Add("test3");
        theList.Add("test1");
        theList.Add("test2");

        _mockRepository = new Mock<IRepository>();

        //The line below returns a null reference...
        _mockRepository.Setup(s => s.list()).Returns(theList);
        _service = new Service(_mockRepository.Object);

        //Act.
        var myList = _service.AllItems();
        Assert.IsNotNull(myList, "myList is null.");

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

Я хотел сделать это очень простым модульным тестом. Ошибка при вызове _mockRepository.Setup. Любая помощь будет оценена!

РЕДАКТИРОВАТЬ -

Сообщение об ошибке

Test method Tests.my_test threw exception:  System.NullReferenceException: Object reference not set to an instance of an object..

Трассировка стека исключений

Moq.MethodCall.SetFileInfo()
Moq.MethodCall..ctor(Mock mock, Expression originalExpression, MethodInfo method, Expression[] arguments)
Moq.MethodCallReturn..ctor(Mock mock, Expression originalExpression, MethodInfo method, Expression[] arguments)
ctor(Mock mock, Expression originalExpression, MethodInfo method, Expression[] arguments)
b__11()
Moq.PexProtector.Invoke[T](Func`1 function)
TResult](Mock mock, Expression`1 expression)
Setup[TResult](Expression`1 expression)
Tests.my_test() in C:\Users\xxx\Documents\Visual Studio 2008\Projects\MoqTest\MoqTest.Tests\Controllers\Tests.cs: line 28

1 Ответ

3 голосов
/ 25 июня 2010

Вне зависимости от проблемы, с которой вы столкнулись, вы можете переместить фиктивную инициализацию в общий метод TestInitialize, который запускается перед каждым тестом.Таким образом, вы можете хранить общий код инициализации в одном месте и сделать свои тесты намного меньше и более читабельными.

[TestInitialize]
public void TestInit() {
    //Arrange.
    List<string> theList = new List<string>();
    theList.Add("test3");
    theList.Add("test1");
    theList.Add("test2");

    _mockRepository = new Mock<IRepository>();

    //The line below returns a null reference...
    _mockRepository.Setup(s => s.list()).Returns(theList);
    _service = new Service(_mockRepository.Object);
}

[TestMethod]
public void my_test()
{
    //Act.
    var myList = _service.AllItems();
    Assert.IsNotNull(myList, "myList is null.");

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

Я только что выполнил этот тест в точности так, как опубликовано, и он работал для меня.Я использую бета-версию Moq v4.0. В этом выпуске было исправление конкретной ошибки, в котором я нуждался, в противном случае 3.1.4 (последний стабильный выпуск) был для меня очень надежным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...