【问题标题】:C# Unit testing with Fake database context using a HashSet (pluralsight code)(New Q)使用 HashSet(pluralsight 代码)使用假数据库上下文进行 C# 单元测试(新 Q)
【发布时间】:2011-05-13 20:35:11
【问题描述】:

简短版:

在此视频中,斯科特·艾伦先生 explains how to test a controller。 但他没有显示类的完整代码:FakeDbContext。 有人可以帮我完成吗?他在“测试控制器”视频中的 06:15 分钟展示了课程。

长版

在学校我有一门选修课,我们学习 C#。我的考试项目是一个使用 MVC3 的 ASP 站点。 为了快速学习,我看过 PluralSight 的视频。我的问题是关于this video 中的一些代码 他解释了如何测试控制器。所以我尝试了: 我制作了一个具有简单索引方法的控制器:

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);
    }

如您所见,我已经尝试创建一个上下文。 index 方法是我要测试的方法。 他接下来要做的是在测试项目中创建一个名为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;
    }
    

当我将此接口添加到我的实体类时,它希望我实现这些方法。 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 和 Entry 是什么,只建议我创建一个方法存根。此类中有更多代码,因此如果需要其他代码,请询问:) 我已将餐厅更改为选修课,因为那是我的数据库中的表名。

这是我忘记的“使用”吗?我又看过视频了,他的 DB 类中没有方法存根。

【问题讨论】:

标签: c# entity-framework unit-testing asp.net-mvc-3


【解决方案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();
    }
}

【讨论】:

  • 看起来不错。明天早上我会试试看它是否有效:)提前谢谢!
  • 效果很好" :D 非常感谢!:D 希望你能再次帮助我。我已经用第 2 部分更新了主要问题。
  • 我猜第二个问题的 Set() 是 SetMap 的 GET() 和 Use() 方法的组合,但我不知道 Entry 方法是什么
  • 好的..我会尝试找到解决方案..感谢您的努力! :D
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-01
  • 1970-01-01
  • 2019-02-14
  • 2014-10-10
相关资源
最近更新 更多