asp.net mvc - Как быстро и эффективно создавать поддельные тестовые объекты - PullRequest
3 голосов
/ 18 июня 2010

В настоящее время я тестирую контроллер в своем приложении mvc и создаю поддельный репозиторий для тестирования. Однако я, кажется, пишу больше кода и трачу больше времени на подделки, чем на реальные репозитории. Это правильно?

Код, который я имею, выглядит следующим образом:

Контроллер

public partial class SomeController : Controller
{
    IRepository repository;

    public SomeController(IRepository rep)
    {
        repository = rep;
    }

    public virtaul ActionResult Index()
    {
        // Some logic
        var model = repository.GetSomething();

        return View(model);
    }
}

IRepository

public interface IRepository
{
    Something GetSomething();
}

Поддельный репозиторий

public class FakeRepository : IRepository
{
    private List<Something> somethingList;

    public FakeRepository(List<Something> somethings)
    {
        somthingList = somthings;
    }

    public Something GetSomething()
    {
        return somethingList;
    }
}

Поддельные данные

class FakeSomethingData
{
    public static List<Something> CreateSomethingData()
    {
        var somethings = new List<Something>();

        for (int i = 0; i < 100; i++)
        {
            somethings.Add(new Something
            {
                value1 = String.Format("value{0}", i),
                value2 = String.Format("value{0}", i),
                value3 = String.Format("value{0}", i)
            });
        }

        return somethings;
    }
}

Фактический тест

[TestClass]
public class SomethingControllerTest
{
    SomethingController CreateSomethingController()
    {
        var testData = FakeSomethingData.CreateSomethingData();
        var repository = new FakeSomethingRepository(testData);

        SomethingController controller = new SomethingController(repository);

        return controller;
    }

    [TestMethod]
    public void SomeTest()
    {
        // Arrange
        var controller = CreateSomethingController();

        // Act
        // Some test here

        // Arrange
    }
}

Все это, похоже, лишний код, тем более что у меня есть несколько репозиториев. Есть ли более эффективный способ сделать это? Может быть, с помощью издевательств?

Спасибо

Ответы [ 3 ]

2 голосов
/ 18 июня 2010

Вы можете издеваться над хранилищем.

(я использую Moq , Макет репозитория базы данных, используя Moq )

1 голос
/ 18 июня 2010

Как предложено на CD, используйте фальшивые рамки. Я тоже использую Moq , и с Moq ваш тестовый код может быть изменен на что-то вроде этого:

// Arrange
var repoMock = new Mock<IRepository>();
repoMock.Setup(r => r.GetSomething()).Returns(TestData.SomeThings);
var controller = new SomethingController(repoMock.Object);

// Act
controller.DoStuff();

// Assert
...

Обычно мне удобно помещать все мои тестовые данные в отдельный класс TestData со статическими свойствами для всего - таким образом я знаю, что тестирую с одинаковыми данными в каждом тесте. Вот что вам нужно в TestData для этого примера:

public static List<Something> SomeThings
{ 
    get
    {     
        var somethings = new List<Something>();

        for (int i = 0; i < 100; i++)
        {
            somethings.Add(new Something
            {
                value1 = String.Format("value{0}", i),
                value2 = String.Format("value{0}", i),
                value3 = String.Format("value{0}", i)
            });
        }

        return somethings;
    }
}
0 голосов
/ 06 сентября 2011

Лучшим способом является использование Dev Magic Fake, так что вы можете смоделировать базу данных и быть постоянными, вы также можете смоделировать пользовательский интерфейс

Просто добавьте ссылку на DevMagicFake.dll

И вы можете кодировать следующее:

 [HttpPost]
        public ActionResult Create(VendorForm vendorForm)
        {
            var repoistory = new FakeRepository<VendorForm>();
            repoistory.Save(vendorForm);
            return View("Page", repoistory.GetAll());
        }

Это сохранит перманент VendorForm в памяти, и вы можете получить его в любое время. Вы также можете сгенерировать данные для этого объекта или любого другого объекта в вашей модели, для получения дополнительной информации.информацию о Dev Magic Fake смотрите по следующей ссылке на CodePlex:

http://devmagicfake.codeplex.com

Спасибо

M.Radwan

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