短的版本:C#单元测试
在这段视频中,斯科特·艾伦先生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);
}
正如你可以看到我已经尝试做一个背景。 索引方法是我想要测试的方法。 他接下来要做的是在测试项目中创建一个名为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;
}
当我这个接口添加到我的实体类是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”类不知道什么套装和Entry是,只建议我做一个方法存根。这个类有更多的代码,所以如果需要请求其他的:)我已经改变了餐厅选修课,因为那个表名称我的数据库。
这是“使用”我忘记了吗?我再次看过视频,他的数据库类中没有方法存根。
@casperOne感谢您的编辑。现在看起来更容易阅读!:) – 2011-05-13 20:52:18
不是问题;没有什么个人反对“你好”和“谢谢你”,但一般[指导是不包括他们在帖子中](http://meta.stackexchange.com/questions/2950/should-hi-thanks-and-taglines-和称呼被移除从 - 个)。 – casperOne 2011-05-13 21:26:35
@casperOne这很酷。只是似乎更多的“个人”,而不是只是抛出一个问题:) – 2011-05-13 21:33:52