【发布时间】: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 类中没有方法存根。
【问题讨论】:
-
@casperOne 感谢您的编辑。现在看起来更容易阅读了! :)
-
没问题;没有什么个人反对“你好”和“谢谢”,但一般guidance is to not include them in posts。
-
@casperOne 太酷了。看起来比只是提出一个问题更“个人化”:)
-
他可能在使用模拟对象?
-
对于仍在使用它的任何人,可以在odetofood.codeplex.com/SourceControl/list/changesets找到完整的源代码
标签: c# entity-framework unit-testing asp.net-mvc-3