簡體   English   中英

單元測試項目堅持要求引用EntityFramework

[英]Unit Test project is insisting that it requires a reference to EntityFramework

我有一個問題剛出現在一個單元測試項目中,堅持要求引用EntityFramework,我確信它不需要它。 其他項目正在引用單元測試項目引用/測試的項目/擴展方法,並且使用擴展方法就好了而沒有引用EntityFramework。

我發現如果我只是在單元測試項目中將擴展方法作為靜態方法執行,那么單元測試項目編譯得很好 - 只是完全困惑。 我沒有在構建輸出中看到任何信息。

這不編譯:

[TestMethod]
public void BuildsEmptyRadioButtonList()
{
    var htmlHelper = Creator.GetHelper();

    var radioButtonList = htmlHelper.RadioButtonList("RadioGaga", new SelectListItem[0]);

    var expected = MvcHtmlString.Create(@"...");
    Assert.AreEqual(expected.ToHtmlString(), radioButtonList.ToHtmlString());
}

構建輸出:

1>------ Build started: Project: HA.Shared.Utilities.Mvc.Tests, Configuration: Debug Any CPU ------
1>C:\hatfs\Web2014\4-Test\Source\HA.Shared.Utilities.Mvc.Tests\HtmlHelperRadioExtensionsTests.cs(25,17,25,20): error CS0012: The type 'System.Data.Entity.IDbSet`1<T0>' is defined in an assembly that is not referenced. You must add a reference to assembly 'EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.
========== Build: 0 succeeded, 1 failed, 8 up-to-date, 0 skipped ==========

該錯誤指向以“var radioButtonList”開頭的行中的“var”,我嘗試將“var”更改為“IHtmlString”而沒有任何更改。

這確實編譯:

[TestMethod]
public void BuildsEmptyRadioButtonList()
{
    var htmlHelper = Creator.GetHelper();

    var radioButtonList = HtmlHelperRadioExtensions.RadioButtonList(htmlHelper, "RadioGaga", new SelectListItem[0]);

    var expected = MvcHtmlString.Create(@"...");
    Assert.AreEqual(expected.ToHtmlString(), radioButtonList.ToHtmlString());
}

構建輸出:

1>------ Build started: Project: HA.Shared.Utilities.Mvc.Tests, Configuration: Debug Any CPU ------
1>  HA.Shared.Utilities.Mvc.Tests -> C:\hatfs\Web2014\4-Test\Source\HA.Shared.Utilities.Mvc.Tests\bin\Debug\HA.Shared.Utilities.Mvc.Tests.dll
========== Build: 1 succeeded, 0 failed, 8 up-to-date, 0 skipped ==========

RadioButtonList方法的簽名是: public static MvcHtmlString RadioButtonList( this HtmlHelper htmlHelper, string name, IEnumerable<SelectListItem> listItems, object radioButtonHtmlAttributes = null, object labelHtmlAttributes = null, bool vertical = false)

我剛剛弄明白了這個問題。 我最近添加的擴展方法ReturnsSet (下),能夠更容易地嘲笑IDbSet小號斷DbContext在共享單元測試“助手”項目秒。 雖然我不知道為什么,顯然編譯器仍然認為它需要引用EntityFramework來編譯出現問題的特定項目。 當我注釋掉新的ReturnsSet擴展方法時,特定的單元測試項目使用擴展方法形式的語法進行編譯。

using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Data.Entity;
using System.Linq;

using Moq;
using Moq.Language.Flow;

public static class DbMockHelpers
{
    public static Mock<IDbSet<TEntity>> MockSingle<TEntity>(TEntity data) 
        where TEntity : class, new()
    {
        return MockDbSet(new[] { data });
    }

    public static Mock<IDbSet<TEntity>> MockDbSet<TEntity>(params TEntity[] data)
        where TEntity : class, new()
    {
        return MockDbSet(data.AsEnumerable());
    }

    public static Mock<IDbSet<TEntity>> MockDbSet<TEntity>(IEnumerable<TEntity> data) 
        where TEntity : class, new()
    {
        var list = data == null ? new List<TEntity>() : data.ToList();
        var observable = new ObservableCollection<TEntity>(list);
        var dbSet = new Mock<IDbSet<TEntity>>();
        dbSet.Setup(d => d.Add(It.IsAny<TEntity>())).Callback((TEntity entity) => list.Add(entity));
        dbSet.Setup(d => d.Remove(It.IsAny<TEntity>())).Callback((TEntity entity) => list.Remove(entity));
        dbSet.Setup(d => d.Attach(It.IsAny<TEntity>())).Callback((TEntity entity) => list.Add(entity));
        dbSet.Setup(d => d.Create()).Returns(new TEntity());
        dbSet.Setup(d => d.GetEnumerator()).Returns(() => list.GetEnumerator());
        dbSet.Setup(d => d.Local).Returns(observable);
        dbSet.Setup(d => d.ElementType).Returns(typeof(TEntity));
        dbSet.Setup(d => d.Provider).Returns(list.AsQueryable().Provider);
        dbSet.Setup(d => d.Expression).Returns(list.AsQueryable().Expression);
        return dbSet;
    } 

    public static IDbSet<TEntity> DbSet<TEntity>(IEnumerable<TEntity> data) 
        where TEntity : class, new()
    {
        return MockDbSet(data).Object;
    }

    public static IDbSet<TEntity> DbSet<TEntity>(params TEntity[] data)
        where TEntity : class, new()
    {
        return MockDbSet(data).Object;
    }

    // commenting out this method allowed the project to compile without the reference to EF
    public static IReturnsResult<T> ReturnsSet<T, TProperty, TEntity>(this ISetupGetter<T, TProperty> setupGetter, params TEntity[] data)
        where T : class
        where TProperty : IDbSet<TEntity>
        where TEntity : class, new()
    {
        return setupGetter.Returns((TProperty)DbSet(data));
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM