Подтвердить что ты не робот

С# Unit с использованием контекста Fake базы данных с использованием HashSet (множественный код) (New Q)

Краткая версия:

В этом видео, Mr. Scott Allen объясняется, как протестировать контроллер. Но он не показывает полный код класса: FakeDbContext. Есть ли кто-нибудь, кто может помочь мне закончить его? Он показывает класс в 06:15 мин в видео для "контрольных контроллеров".

Расширенная версия

В школе у ​​меня есть выборные, где мы изучаем С#. Мой экзаменационный проект - это сайт ASP с использованием MVC3. Чтобы узнать это быстро, я видел видео с PluralSight. Мой вопрос о некотором коде, который находится в этом видео Он объясняет, как тестировать контроллеры. Поэтому я попробовал: Я создал контроллер, который имеет простой индексный метод:

public class Round1Controller : Controller
{
    IDbContext _db;

    public Round1Controller()
    {
        _db = new Entities();
    }

    public Round1Controller(IDbContext db)
    {
        _db = db;
    }

    public ActionResult Index()
    {
        var model = _db.ELECTIVES.ToList();

        return View(model);
    }

Как вы можете видеть, я уже пытался создать контекст. Метод индекса - это тот, который я хочу тестировать. Следующее, что он делает, это сделать класс, называемый FakeDbContext, в тестовом проекте.

Но, к сожалению, он только показывает часть кода, и я использовал много часов, пытаясь выяснить, как он создает метод get для HashSet.

Вот код, который вы можете видеть из видео:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using EESS.Models;

namespace EESS.Tests
{
class FakeDbContext : IDbContext
{
    public IQueryable<Restaurant> Restaurants
    {
        get { return _map.Get<Restaurant>().asQueryable(); }
        set { _map.Use<Restaurant>(value); }
    }
    public IQueryable<Review> Reviews
    {
        get { return _map.Get<Review>().asQueryable(); }
        set { _map.Use<Review>(value); }
    }

    public int SaveChanges()
    {
        ChangesSaved = true;
        return 0;
    }

    public bool ChangesSaved { get; set; }

    public T Attach<T>(T entity) where T : class
    {
        _map.Get<T>().Add(entity);
        return entity;
    }
    public T Add<T>(T entity) where T : class
    {
        _map.Get<T>().Add(entity);
        return entity;
    }

    public T Delete<T>(T entity) where T : class
    {
        _map.Get<T>().Remove(entity);
        return entity;
    }

    SetMap _map = new SetMap();

    class SetMap : KeyedCollection<Type, object>
    {
        public HashSet<T> Use<T>(IEnumerable<T> sourceData)
        {
            var set = new HashSet<T>(sourceData);
            if (Contains(typeof(T)))
            {
                Remove(typeof(T));
            }
            Add(set);
            return set;
        }
    }
}
}

Чтобы закончить длинную версию, моя проблема в том, что я получаю сообщение об ошибке _Map.Get. Does not contain a definition or extension method.

ИЗМЕНИТЬ! ЧАСТЬ 2:

После того, как @xelibrion получило отличный ответ, он наконец-то сработал.

Но затем возникает другая проблема.

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

public interface IDbContext
    {
        IQueryable<ELECTIVES> ELECTIVES { get; }
        int SaveChanges();
        T Attach<T>(T entity) where T : class;
        T Add<T>(T entity) where T : class;
        T Delete<T>(T entity) where T : class;
    }

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

public DbSet<ELECTIVES> electives { get; set; }

    IQueryable<ELECTIVES> IDbContext.ELECTIVES
    {
        get { return electives; }
    }

    int IDbContext.SaveChanges()
    {
        return SaveChanges();
    }

    T IDbContext.Add<T>(T entity)
    {
        return Set<T>().Add(entity);
    }

    T IDbContext.Delete<T>(T entity)
    {
        return Set<T>().Remove(entity);
    }

    T IDbContext.Attach<T>(T entity)
    {

        var entry = Entry(entity);
        entry.State = System.Data.EntityState.Modified;
        return entity;
        return Set<T>().Add(entity);
    }

Но мой класс "_dbModel.Designer.cs" из моей модели сущности не знает, что такое Set and Entry, и предлагаю только сделать заглушку метода. В этом классе есть намного больше кода, поэтому, если его нужно просто попросить все остальное:), я изменил "Рестораны на факультативы", так как это имя таблицы я моей базы данных.

Является ли это "использованием", я забыл? Я снова видел видео, и у него нет своего метода в его классе DB.

4b9b3361

Ответ 1

Я предполагаю, что полная версия класса SetMap должна выглядеть так:

class SetMap : KeyedCollection<Type, object>
{
    public HashSet<T> Use<T>(IEnumerable<T> sourceData)
    {
        var set = new HashSet<T>(sourceData);
        if (Contains(typeof(T)))
        {
            Remove(typeof(T));
        }
        Add(set);
        return set;
    }

    public HashSet<T> Get <T>()
    {
        return (HashSet<T>) this[typeof(T)];
    }

    protected override Type GetKeyForItem(object item)
    {
        return item.GetType().GetGenericArguments().Single();
    }
}