gpt4 book ai didi

使用 HashSet(pluralsight 代码)的假数据库上下文的 C# 单元测试(新 Q)

转载 作者:可可西里 更新时间:2023-11-01 08:10:12 29 4
gpt4 key购买 nike

简短版:

在此视频中,Scott Allen 先生 explains how to test a controller .但是他没有展示类的完整代码:FakeDbContext。有没有人可以帮我完成它?他在“测试 Controller ”视频的 06 分 15 分展示了类(class)。

长版

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

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 的类。

但遗憾的是他只展示了一部分代码,我花了很多时间试图弄清楚他是如何为 HashSet 创建一个 get 方法的。

这是您可以从视频中看到的代码:

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 上遇到错误。不包含定义或扩展方法

编辑!第 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;
}

当我将此接口(interface)添加到我的实体类时,它当然希望我实现这些方法。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 是什么,只建议我制作一个方法 stub 。此类中有更多代码,因此如果需要,只需询问其余部分 :) 我已将 Restaurants 更改为 Electives,因为那是我数据库中的表名。

这是我忘记的“使用”吗?我又看了一遍视频,他的数据库类中没有方法 stub 。

最佳答案

我想完整版的 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();
}
}

关于使用 HashSet(pluralsight 代码)的假数据库上下文的 C# 单元测试(新 Q),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5997473/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com