簡體   English   中英

如何使用Moq測試與數據庫交互的方法?

[英]How can I test methods that interact with a database with Moq?

在我的MVC4應用程序中,幾乎每個方法都使用數據庫。 現在我想測試這些方法,我看了這個教程。 建議在那里使用Moq來制作模擬對象。

在這種特殊情況下,我想測試ShoppingCart類的GetTotal方法(基於Microsoft教程 ),該方法依賴於AddToCart方法,該方法看起來像這樣

public class ShoppingCart() {
    projectContext db = new projectContext ();

    public virtual void AddToCart(Product product)
    {
        var cartItem = db.Carts.SingleOrDefault(
            c => c.CartId == ShoppingCartId
            && c.ProductId == product.ProductId);

        if (cartItem == null)
        {  
            cartItem = new Cart
            {
                ProductId = product.ProductId,
                CartId = ShoppingCartId,
                Count = 1,
                DateCreated = DateTime.Now
            };
            db.Carts.Add(cartItem);
        }
        else
        {
            cartItem.Count++;
        }
        db.SaveChanges();
    }

    public virtual decimal GetTotal()
    {  
        decimal? total = (from cartItems in db.Carts
                          where cartItems.CartId == ShoppingCartId
                          select (int?)cartItems.Count *
                          cartItems.Product.Price).Sum();

        return total ?? decimal.Zero;
    }
}

可以看出,兩種方法都依賴於projectContext實例db。

在測試這些方法時,我想使用這樣的模擬對象:

[TestClass]
public class ShoppingCartTest : DbContext
{

    [TestMethod]
    public void GetTotalTest()
    {
        // Arrange
        var _cart = new Mock<ShoppingCart>() { CallBase = true };
        var _mock = new Mock<Product>() { CallBase = true };
        _mock.SetupGet(m => m.Price).Returns(10.00M);

        // Act
        _cart.AddToCart() // cannot find method since no definiton can be found

        // Assert
       Assert.AreEqual(10.00M, _cart.GetTotal());// cannot find GetTotal method since no definiton can be found
    }

}

我怎樣才能可能測試這些方法? 是否可以創建一個“假的”數據庫並使用它? 或者我可以調整模擬對象的方式可以使用方法(使用“模擬方法”似乎我錯過了測試實際方法的點......)?

測試這很難,我不確定是否可以嘲笑它。 如果您可以使用DI(依賴注入),您可以解決所有問題。 通過使用DI,您可以模擬projectContext類並使其返回您需要的任何內容。 查看Autofac( http://www.codeproject.com/Articles/25380/Dependency-Injection-with-Autofac ),它可能已經安裝在您的mvc解決方案中。

您的問題是您的ShoppingCart類直接與數據庫層耦合。

隱藏對抽象背后的具體projectContext依賴,例如接口,因此您可以在測試使用它的生產代碼時替換它。

取決於抽象......

暫無
暫無

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

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