Как выполнить юнит-тест IDataErrorInfo? - PullRequest
0 голосов
/ 21 августа 2009

Читаю Asp.net MVC Framework и я читаю о IDataErrorInfo как форма проверки.

Так что я просто хочу, чтобы после того, что у него есть.

Продукт класса

using System;
using System.Collections.Generic;
using System.ComponentModel;

namespace MvcApplication1.Models
{
    public partial class Product : IDataErrorInfo
    {

        private Dictionary<string, string> _errors = new Dictionary<string, string>();

        partial void OnNameChanging(string value)
        {
            if (value.Trim() == String.Empty)
                _errors.Add("Name", "Name is required.");
        }


        partial void OnPriceChanging(decimal value)
        {
            if (value <= 0m)
                _errors.Add("Price", "Price must be greater than 0.");
        }


        #region IDataErrorInfo Members

        public string Error
        {
            get { return string.Empty; }
        }

        public string this[string columnName]
        {
            get
            {
                if (_errors.ContainsKey(columnName))
                    return _errors[columnName];
                return string.Empty;
            }
        }

        #endregion


    }
}

ProductRepository.

using System.Collections.Generic;
using System.Linq;

namespace MvcApplication1.Models
{
    public class ProductRepository : IProductRepository
    {
        private ProductsDBEntities _entities = new ProductsDBEntities();

        public IEnumerable<Product> ListProducts()
        {
            return _entities.ProductSet.ToList();
        }

        public void CreateProduct(Product productToCreate)
        {
            _entities.AddToProductSet(productToCreate);
            _entities.SaveChanges();
        }

    }

    public interface IProductRepository
    {
        IEnumerable<Product> ListProducts();
        void CreateProduct(Product productToCreate);
    }
}

Контроллер

using System.Web.Mvc;
using MvcApplication1.Models;

namespace MvcApplication1.Controllers
{
    public class ProductController : Controller
    {
        private IProductRepository _repository; 

        public ProductController()
            :this(new ProductRepository()){}


        public ProductController(IProductRepository repository)
        {
            _repository = repository;
        }


        public ActionResult Index()
        {
            return View(_repository.ListProducts());
        }


        //
        // GET: /Product/Create

        public ActionResult Create()
        {
            return View();
        } 

        //
        // POST: /Product/Create

        [AcceptVerbs(HttpVerbs.Post)]
        public ActionResult Create([Bind(Exclude="Id")]Product productToCreate)
        {
            if (!ModelState.IsValid)
                return View();
            _repository.CreateProduct(productToCreate);
            return RedirectToAction("Index");
        }


    }
}

Еще нет, где в книге я вижу, как на самом деле это модульное тестирование. Как он показывает, как блок проверки его службы слоя материала, но ничего о модульном тестировании IDataErrorInfo.

Так как бы модульное тестирование я это? Я люблю проверять сообщения об ошибках, чтобы увидеть, если они одинаковы. Как, если я прохожу в нулевом поле, я хотел бы проверить, если сообщение об ошибке будет правильным выбором для этого нулевого поля.

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

Ответы [ 2 ]

2 голосов
/ 11 августа 2010

Решение, упомянутое Мэттом, работает только для меня, если я использую более поздний оператор для утверждения -

Assert.AreEqual («Имя обязательно.», _Product [«Имя»]); - это работает для меня

Assert.AreEqual («Имя обязательно.», _Product.Error); - это не работает для меня

1 голос
/ 13 октября 2009

Модульное тестирование IDataErrorInfo довольно простое. Просто настройте свои тесты с «действительным» экземпляром объекта, а затем проверьте, что вы можете сделать его ошибочным:

[TestFixture]
public class ErrorTests
{
    private Product _product; // subject under test

    [SetUp]
    public void Create_valid_instance()
    {
        _product = new Product { /* valid values */ };
    }

    [Test]
    public void Name_cannot_be_null()
    {
        _product.Name = null; 
        Assert.AreEqual("Name is required.", _product.Error);
        Assert.AreEqual("Name is required.", _product["Name"]);
    }

    [Test]
    public void Name_cannot_be_empty()
    {
        _product.Name = String.Empty; 
        Assert.AreEqual("Name is required.", _product.Error);
        Assert.AreEqual("Name is required.", _product["Name"]);
    }

    [Test]
    public void Name_cannot_be_whitespace()
    {
        _product.Name = "   ";
        Assert.AreEqual("Name is required.", _product.Error);
        Assert.AreEqual("Name is required.", _product["Name"]);
    }

    /* etc - add tests to prove that errors can occur */
}
...