亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

在 C# 中使用 Moq 模擬服務

在 C# 中使用 Moq 模擬服務

C#
躍然一笑 2022-06-12 14:47:16
我有一個以這種方式設置的服務。public Interface IDataService : IDisposable{    IQueryable<T> Set<T>() where T : class;    IDbSet<T> WritableSet<T>() where T : class;}IDataService 由 DataService 繼承。public abstract class DataService : IDataService{    public IDataContext DataContext { get; private set; }    public IQueryable<T> Set<T>() where T : class    {        return DataContext.Set<T>().AsNoTracking();    }    public IDbSet<T> WritableSet<T>() where T : class    {        return DataContext.Set<T>();    }    public AddResult<T> Add<T>(T obj) where T : class, IPersistentEntity    {        if (obj == null)            return new AddResult<T>() { IsValid = false };        else        {            if (obj.Id == Guid.Empty)                WritableSet<T>().Add(obj);            bool success = DataContext.SaveChanges() > 0;            return new AddResult<T>() { Entity = obj, IsValid = success };        }    }}并且 DataService 是由 EntityService 繼承的。public class EntityService : DataService{    public EntityService(IDataContext DataContext) : base(DataContext)    {    }    public void EntityStarted(Guid Id)    {        var a = GetWriteableById<Entity>(Id);        a.Status = 1;        DataContext.SaveChanges();    }}此 EntityService 用于我的一個組件中。EntityService 的對象被創建并傳遞給組件的構造函數。我正在使用 Moq 對組件執行一些測試,為此,計劃是模擬 EntityService,以便 EntityService 使用帶有虛擬數據的假數據庫容器進行類似數據庫的操作。但是,我沒有最好的主意用最少的新代碼來模擬這個。我擁有的最不吸引人的想法是使用接口創建一個假的 EntityService 類,并擁有適合測試的自己的實現。幫助表示贊賞!:)
查看完整描述

2 回答

?
catspeake

TA貢獻1111條經驗 獲得超0個贊

根據@JLe 和@Chetan 對這個問題的評論,我不得不模擬 DbContext。我按照這篇文章來模擬 DbContext。


使用 Moq 模擬 DbContext


這是代碼的樣子。


    private void Setup()

    {

        List<Entity> entityData = new List<Entity>();

        entityData.Add(new Entity

        {

            Id = Guid.NewGuid()

        });


        DbSet<Entity> MockEntitySet = GetSet(entityData);


        MockContext = new Mock<IDbContext>();

        MockContext.Setup(m => m.Set<Entity>()).Returns(MockEntitySet);

    }


    public static DbSet<T> GetSet<T>(List<T> sourceList) where T : class

    {

        return GetSet(sourceList.ToArray());

    }


    public static DbSet<T> GetSet<T>(T[] sourceList) where T : class

    {

        var name = typeof(T).Name;


        var queryable = sourceList.AsQueryable();


        Mock<DbSet<T>> dbSet = new Mock<DbSet<T>>();


        dbSet.As<IQueryable<T>>().Setup(m => m.Provider).Returns(queryable.Provider);

        dbSet.As<IQueryable<T>>().Setup(m => m.Expression).Returns(queryable.Expression);

        dbSet.As<IQueryable<T>>().Setup(m => m.ElementType).Returns(queryable.ElementType);

        dbSet.As<IQueryable<T>>().Setup(m => m.GetEnumerator()).Returns(queryable.GetEnumerator());


        dbSet.Setup(m => m.AsNoTracking()).Returns(dbSet.Object);


        return dbSet.Object;

    }


    [TestMethod]

    public void Test()

    {

        EntityService service = new EntityService(MockContext.Object);

        ComponentToTest compObj = new ComponentToTest(service);

        compObj.MethodToTest(...);


        // Assertions

    }

感謝你們!感謝您的幫助和建議。


查看完整回答
反對 回復 2022-06-12
?
GCT1015

TA貢獻1827條經驗 獲得超4個贊

要模擬你需要一個接口,如果沒有,你需要將要模擬的方法標記為虛擬。

在幕后,模擬框架將為您創建一個新的實現,其行為與您配置模擬一樣。

希望能幫助到你。


查看完整回答
反對 回復 2022-06-12
  • 2 回答
  • 0 關注
  • 236 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號