【问题标题】:FakeitEasy return null objectFakeitEasy 返回空对象
【发布时间】:2015-02-11 03:12:00
【问题描述】:

我创建了一个存储库类来访问我的数据库,然后我使用 FakeItEasy 库进行了单元测试。使用真实存储库我得到了预期的结果,而使用假存储库返回 null。

[TestClass]
public class clientRepositoryTest
{
    [TestMethod]
    public void GetclientById()
    {
        var fakeRepository = A.Fake<IclientRepository>();
        const int expectedclient = 1;

        IclientRepository realRepository = new clientRepository();
        var realResult = realRepository.GetclientById(expectedclient); // returns expected object

        try
        {
            A.CallTo(() => fakeRepository.GetclientById(expectedclient)).MustHaveHappened();
            var fakeResult = fakeRepository.GetSupplierById(expectedSupplier); // returns null
            A.CallTo(() => fakeRepository.GetSupplierById(expectedSupplier).IdSupplier).Equals(expectedSupplier); 
        }
        catch (Exception ex)
        {
            //The current proxy generator can not intercept the specified method for the following reason:
            // - Non virtual methods can not be intercepted.
        }
    }

【问题讨论】:

  • 除非该测试缺少一些代码,否则我认为您错过了重点。您并不是要在测试中直接调用假的方法,而是要将假作为依赖项传递给您正在测试的类,以便可以使用它来代替真正的依赖项。如果您将其用作依赖项,则必须指定结果。看看fakeiteasy.github.io,主页上的简单示例足以让您入门。
  • GetSupplierById 方法应该在调用之前初始化。

标签: visual-studio-2010 unit-testing repository-pattern fakeiteasy


【解决方案1】:

在调用任何实际函数调用之前,您需要确保调用所有内部假调用,如下所示

 A.CallTo(() => fakeRepository.GetclientById(expectedclient)).WithAnyArguments().Returns(Fakeobject/harcoded object);

然后进行单元测试调用

 var fakeResult = fakeRepository.GetSupplierById(expectedSupplier); 

之后选择 MustHaveHappened/MustNotHaveHappened/Equals

A.CallTo(() => fakeRepository.GetclientById(expectedclient)).MustHaveHappened();
A.CallTo(() => fakeRepository.GetSupplierById(expectedSupplier).IdSupplier).Equals(expectedSupplier);

实现应该是这样的

[TestClass]
    public class clientRepositoryTest
    {
        [TestMethod]
        public void GetclientById()
        {
            var fakeRepository = A.Fake<IclientRepository>();
            const int expectedclient = 1;

            IclientRepository realRepository = new clientRepository();
            var realResult = realRepository.GetclientById(expectedclient); // returns expected object

            try
            {
                A.CallTo(() => fakeRepository.GetclientById(expectedclient)).WithAnyArguments().Returns(Fakeobject/harcoded object);
                var fakeResult = fakeRepository.GetSupplierById(expectedSupplier); // returns null
        A.CallTo(() => fakeRepository.GetclientById(expectedclient)).MustHaveHappened();
                A.CallTo(() => fakeRepository.GetSupplierById(expectedSupplier).IdSupplier).Equals(expectedSupplier); 
            }
            catch (Exception ex)
            {
                //The current proxy generator can not intercept the specified method for the following reason:
                // - Non virtual methods can not be intercepted.
            }
        }

【讨论】:

    猜你喜欢
    • 2013-02-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-29
    • 2020-12-21
    • 2019-04-08
    • 2012-02-22
    相关资源
    最近更新 更多