第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

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

在 C# 中使用 Moq 模擬服務(wù)

在 C# 中使用 Moq 模擬服務(wù)

C#
躍然一笑 2022-06-12 14:47:16
我有一個以這種方式設(shè)置的服務(wù)。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 的對象被創(chuàng)建并傳遞給組件的構(gòu)造函數(shù)。我正在使用 Moq 對組件執(zhí)行一些測試,為此,計劃是模擬 EntityService,以便 EntityService 使用帶有虛擬數(shù)據(jù)的假數(shù)據(jù)庫容器進行類似數(shù)據(jù)庫的操作。但是,我沒有最好的主意用最少的新代碼來模擬這個。我擁有的最不吸引人的想法是使用接口創(chuàng)建一個假的 EntityService 類,并擁有適合測試的自己的實現(xiàn)。幫助表示贊賞!:)
查看完整描述

2 回答

?
catspeake

TA貢獻1111條經(jīng)驗 獲得超0個贊

根據(jù)@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

    }

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


查看完整回答
反對 回復(fù) 2022-06-12
?
GCT1015

TA貢獻1827條經(jīng)驗 獲得超4個贊

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

在幕后,模擬框架將為您創(chuàng)建一個新的實現(xiàn),其行為與您配置模擬一樣。

希望能幫助到你。


查看完整回答
反對 回復(fù) 2022-06-12
  • 2 回答
  • 0 關(guān)注
  • 247 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號