C#使用HashSet(复数代码)使用Fake数据库上下文进行单元测试(新Q)

And*_*ner 13 c# unit-testing entity-framework asp.net-mvc-3

简短版本:

在这段视频中,Scott Allen先生解释了如何测试控制器.但他没有显示该课程的完整代码:FakeDbContext.有人可以帮我完成吗?他在06:15分钟在视频中为"测试控制器"展示了课程.

长版

在学校,我有一个选修课,我们学习C#.我的考试项目是一个使用MVC3的ASP站点.为了快速学习,我看过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);
    }
Run Code Online (Sandbox Code Playgroud)

正如你所看到的,我已经尝试过创建一个上下文.索引方法是我想要测试的方法.他接下来要做的是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;
        }
    }
}
}
Run Code Online (Sandbox Code Playgroud)

要结束长版本,我的问题是我收到错误_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;
    }
Run Code Online (Sandbox Code Playgroud)

当我将这个接口添加到我的实体类时,它会让我想要实现这些方法.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);
    }
Run Code Online (Sandbox Code Playgroud)

但是我的实体模型中的"_dbModel.Designer.cs"类不知道Set和Entry是什么,只建议我创建一个方法存根.这个类中有很多代码,所以如果需要请求其余的:)我已经将餐厅改为选修课,因为这就是我的数据库中的表名.

它是一个"使用"我忘记了吗?我再次看过该视频,并且他的DB类中没有方法存根.

xel*_*ion 11

我想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();
    }
}
Run Code Online (Sandbox Code Playgroud)