0

我正在尝试使用 Ninject Moq 框架创建一个简单的单元测试,但由于某种原因,我无法让 Setup 方法正常工作。据我了解,下面的 Setup 方法应该将存储库注入到 Service 类中,预定义结果为 true。

 [TestFixture]
public class ProfileService : ServiceTest
{
    private readonly Mock<IRepository<Profile>> _profileRepoMock;

    public ProfileService()
    {
        MockingKernel.Bind<IProfileService>().To<Data.Services.Profiles.ProfileService>();
        _profileRepoMock = MockingKernel.GetMock<IRepository<Profile>>();
    }


    [Test]
    public void CreateProfile()
    {
        var profile = new Profile()
            {
                Domain = "www.tog.us.com",
                ProfileName = "Tog",
            };

        _profileRepoMock.Setup(x => x.SaveOrUpdate(profile)).Returns(true);
        var profileService = MockingKernel.Get<IProfileService>();
        bool verify = profileService.CreateProfile(Profile);

        _profileRepoMock.Verify(repository => repository.SaveOrUpdate(profile), Times.AtLeastOnce());

        Assert.AreEqual(true, verify);
    }
}

当我尝试验证它时,我收到此错误:

对模拟的预期调用至少一次,但从未执行过:repository => repository.SaveOrUpdate(.profile)

配置设置:x => x.SaveOrUpdate(.profile), Times.Never

执行的调用:IRepository`1.SaveOrUpdate(DynamicCms.Data.DataModels.Profile)

这是 ProfileService 类中的 CreateProfile 方法:

public class ProfileService : IProfileService
    {
        private readonly IRepository<Profile> _profileRepo;

        public ProfileService(IRepository<Profile> profileRepo)
        {
            _profileRepo = profileRepo;
        }
            public bool CreateProfile(ProfileViewModel profile)
        {
            Profile profileToCreate = new Profile
                {
                    Domain = profile.Domain,
                    ProfileName = profile.Name
                };

            bool verify = _profileRepo.SaveOrUpdate(profileToCreate);

            if (verify)
            {
                return true;
            }

            return false;
        }
}

编辑:我替换了传入的 Profile 对象

_profileRepoMock.Setup(x => x.SaveOrUpdate(profile)).Returns(true); 

_profileRepoMock.Setup(x => x.SaveOrUpdate(It.IsAny<Profile>())).Returns(true); 

这个方法现在可以工作,但是为什么当我将同一个对象传递给验证和设置方法时它不能工作。

回顾一下,由于这个方法被设置为返回一个特定的值,所以传递给它的内容并不重要,但很高兴知道。

4

1 回答 1

0

您不需要使用 NInject 进行单元测试:

[TestFixture]
public class ProfileServiceTest : ServiceTest
{
    private readonly Mock<IRepository<Profile>> _profileRepoMock;
}
[SetUp]
public void Setup()
{
    _profileRepoMock = new Mock<IRepository<Profile>>();
}

[Test]
public void CreateProfile()
{
    var profile = new Profile()
        {
            Domain = "www.tog.us.com",
            ProfileName = "Tog",
        };

    _profileRepoMock.Setup(x => x.SaveOrUpdate(profile)).Returns(true);
    var profileService = new ProfileService(_profileRepoMock.Object);
    bool verify = profileService.CreateProfile(Profile);

    _profileRepoMock.Verify(repository => repository.SaveOrUpdate(profile), Times.AtLeastOnce());

    Assert.AreEqual(true, verify);
}

}

编辑:这个类将不得不稍微修改

public class ProfileService : IProfileService
{
    private readonly IRepository<Profile> _profileRepo;

    public ProfileService(IRepository<Profile> profileRepo)
    {
        _profileRepo = profileRepo;
    }
        public bool CreateProfile(ProfileViewModel profile)
    {

        bool verify = _profileRepo.SaveOrUpdate(profile);

        if (verify)
        {
            return true;
        }

        return false;
    }
 }
于 2013-06-04T19:40:10.660 回答