【问题标题】:Unit Testing - Can't Access Method From Repository Class单元测试 - 无法从存储库类访问方法
【发布时间】:2015-12-06 21:05:23
【问题描述】:

我正在编写一个单元测试,用于验证特定产品的选择是否具有正确的数据。目前,测试提供以下错误:

System.NullReferenceException:对象引用未设置为对象的实例。

在通过测试进行调试时,我注意到我的result 变量为空...我以为我正确调用了我的SelectProduct 方法,但不确定是什么问题。

其他问题 - 关于如何更好地断言的任何建议?

[TestClass]
    public class ProductRepositoryTests
    {
        [TestMethod]
        public void SelectProduct_selectProduct_productIsSelected()
        {        
            // access ProductRepository
            Mock<IProductRepository> mock = new Mock<IProductRepository>();

            // Arrange - mocked product
            Product product1 = new Product
            {
                ProductId = 1,
                ProductName = "Snicker Bar",
                ProductPrice = .25M,
                ProductCategory = "Candy",
                ProductQuantity = 12
            };

            // Act - select new product using SelectProduct method
            var result = mock.Object.SelectProduct(product1.ProductId);

            // Assert
            Assert.AreEqual(result.ProductId, 1);
            Assert.AreEqual(result.ProductName, "Snicker Bar");
            Assert.AreEqual(result.ProductPrice, .25M);
        }
    }

这是我的 Repository 层的其他代码:

界面:

public interface IProductRepository
{
    Product SelectProduct(int productId);
}

存储库类:

 public class ProductRepository : IProductRepository
    {
        public Product SelectProduct(int productId)
        {
            throw new System.NotImplementedException();
        }
    }

【问题讨论】:

  • 本次测试中您的被测系统是什么?看来您正在测试一个模拟/假对象,而不是一个真正的类。
  • 这是一个很好的问题@YacoubMassad...我正在尝试在我的 ProductRepository 中测试该方法。这有帮助吗?请记住,我还没有实现我的 SelectProduct 方法,所以我可以遵循 TDD

标签: c# asp.net unit-testing moq


【解决方案1】:

您似乎想测试 ProductRepository 类,但您却在测试一个假对象。

你的测试应该是这样的:

// Arrange
var sut = new ProductRepository(); //sut means System Under Test
...

// Act - select new product using SelectProduct method
var result = sut.SelectProduct(product1.ProductId);

// Assert
....

Fakes(或 Mocks)仅用于伪造被测类的依赖关系,而不是类本身。因此,在这个特定的测试中,您不需要使用模拟框架。

【讨论】:

  • 非常感谢@YacoubMassad...一旦时间框架开放,我会将其标记为答案...您如何看待我的断言,这是测试它的好方法吗我选择了正确的产品?另外,我还有其他依赖注入的类,我需要为这些类使用 Mock 吗?
  • 您的断言没问题。一个潜在的改进是让Product 类实现IEquatable&lt;Product&gt;,然后你可以有一个Assert.AreEqualproduct1result 进行比较。
  • 如果您正在测试一个具有依赖关系的类,那么您应该创建这些依赖关系的假冒/模拟并将它们手动注入到 SUT 构造函数中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-19
  • 2018-02-04
相关资源
最近更新 更多