- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我在单元测试中遇到问题,我使用最小起订量框架来模拟我的数据库接口(interface)以返回数据集。问题是,当我调用 BLL 方法时,它返回 null 而不是我设置的对象。BLL代码为:
public ApplicationsManager(IApplicationsManagerDal applicationsManagerDal)
{
_applicationsManagerDal = applicationsManagerDal ?? throw new Exception("applicationsManagerDAL is null");
}
public IpApplication AddIpApplication(IpApplication ipApplication)
{
try
{
if (Validator.ExecuteValidation(ipApplication, new AddIpApplicationValidationRules()).ValidationFailures != null)
return ipApplication;
ipApplication = _applicationsManagerDal.AddIpApplication(ipApplication);
ipApplication.Status = CommonStatus.OperationOk;
}
catch (BaseException e)
{
ipApplication.Status = e.Status;
}
catch (Exception e)
{
ipApplication.Status = ExceptionHandler.SetStatusForException();
NLogger.LogException("IpApplication Name:" + ipApplication.Name, e);
}
return ipApplication;
}
我设置最小起订量的代码是:
var _mock = new Mock<IApplicationsManagerDal>();
_mock.Setup(a => a.AddIpApplication(new IpApplication
{
Code = new Guid("00000000-B935-4E12-9037-000000000000"),
Name = "APPLICATION_ZERO"
}))
.Returns(() => new IpApplication
{
Code = new Guid("9631E691-B935-4E12-9037-2E874DB15B0D"),
Description = "Test application",
Enabled = true,
Name = "APPLICATION_ZERO",
});
单元测试是:
[TestMethod(), TestCategory("Unit")]
public void AddIpApplication_ValidRequest_IpApplicationSuccessfullyAdded()
{
// Arrange
_ipApplication = new IpApplication
{
Code = new Guid("9631E691-B935-4E12-9037-2E874DB15B0D"),
Name = "APPLICATION_ZERO"
};
// Act AddIpApplication
_ipApplication = _applicationManager.AddIpApplication(_ipApplication);
Assert.IsTrue(_ipApplication.Code != Guid.Empty);
}
当测试调用 BLL 方法到达行时:
ipApplication = _applicationsManagerDal.AddIpApplication(ipApplication);
它总是返回空值。你能解释一下为什么吗?我如何获得设定值或如何更改单元测试?谢谢你,对不起我的英语不好
最佳答案
当模拟没有完全按照设置调用时,它不会按预期运行。
在您的情况下,您传递给模拟的实例/引用不同于模拟设置中使用的实例/引用。这将导致模拟在调用时返回 null(默认行为)。
为了更加灵活地传递参数,您可以使用 It.IsAny<IpApplication>()
接受任何参数以及 Callback
在提供的参数上设置所需的属性。这应该允许使用提供的模拟来执行被测方法。
_mock
.Setup(_ => _.AddIpApplication(It.IsAny<IpApplication>()))
.Callback((IpApplication arg) => { //<-- use call back to modify the provided parameter
arg.Code = new Guid("9631E691-B935-4E12-9037-2E874DB15B0D");
arg.Description = "Test application";
arg.Enabled = true;
arg.Name = "APPLICATION_ZERO";
})
.Returns((IpApplication arg) => arg); //<-- return provided parameter after Callback
//inject the mock into the subject under test.
_applicationManager = new ApplicationsManager(mock.Object);
引用 Moq Quickstart获取有关如何使用该框架的更多详细信息。
关于C# Moq 框架返回空引用不正确的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48229604/
我有一个测试,我像这样传入一个对象: var repo = new ActualRepo(); var sut = new Sut(repo); 在我的测试中,Repo 有一个我需要实际执行的方法,而
想知道是否有可能将 Prism 事件聚合器最小化 让我们以他们拥有的EventAggregator快速入门为例 [TestMethod] public void Presente
我正在 mock MSMQ 的包装器。包装器只是允许创建一个直接调用 MessageQueue 类的静态方法的对象实例。 我想测试阅读队列是否筋疲力尽。为此,我希望模拟包装器返回一些好的结果,并在第四
我正在尝试开始使用最小起订量,但无法找到任何好的资源来做我需要的事情。 我有一个数据接口(interface)类,它有一个通过存储过程返回数据集的 Get 方法。这就是代码的编写方式,我目前无法更改它
我想使用 Moq 框架。我想下载框架,所以我到达了http://code.google.com/p/moq/通过谷歌,但第一行提到这个项目已转移到GitHub。当我去 GitHub 时,我只看到了源代
我想看看 Moq 是否是我想在新项目中使用的东西,因为我使用的其他模拟框架正在挑战恕我直言。例如,我有一个方法: IEnumerable GetPickLists(); 我不确定我应该如何 mock
这看起来很简单,但我似乎无法让它工作。 我有一个带有 Save 方法的类,它只调用另一个方法 ShouldBeCalled()。我想验证如果我调用 Save() 另一个方法 ShouldBeCalle
我正在修改一个类方法,它格式化一些输入参数日期,这些日期随后在方法调用中用作参数到基类(位于另一个程序集中)。 我想验证我传递给我的方法的日期在传递给基类方法时的格式是否正确,因此我想对基类方法调用进
我有以下方法: public CustomObect MyMethod() { var lUser = GetCurrentUser(); if (lUser.HaveAccess)
我有一个对象,我正在尝试使用最小起订量来模拟。该对象的构造函数具有必需的参数: public class CustomerSyncEngine { public CustomerSyncEng
我找不到对齐的 moq 和 moq contrib 版本。我可能只是谷歌失败了。 详情: 是否有适用于 moq 版本 4.0.10827 的 moq.contrib 版本,最新版本来自 http://
有没有人试过这个? 我喜欢最小起订量,我喜欢 pex 正在做的事情,但还没有一起尝试过。我认为在大多数情况下,我更喜欢使用 moq 而不是痣,但很想知道是否有人遇到了障碍? 他们玩得好吗? 最佳答案
VerABLE() 的目的是什么? 如果我验证 Mock 并将其保留,它仍然会验证 SetUp。 编辑:我使用的是VerifyAll(),因此所有内容都被验证。更改为 Verify() 后,仅检查我的
我在一个使用 Moq 和 AutoFixture.AutoMoq 的特定项目的构建服务器上运行单元测试时遇到问题。这是错误: System.IO.FileLoadException : Could n
我正在尝试创建一个具体类的模拟,并用另一个模拟来模拟它的一个属性。 public class MyClass { public virtual IAdapter Adapter {get; int
我无法使用 Moq (v.4.2) 在 protected 方法上设置回调。 代码如下所示: public abstract class AbstractClass { protected a
我在我的测试约定中使用 AutoMoqCustomization。 考虑下面的代码。一切都很好,直到我向其中一个具体类添加构造函数。当我这样做时,我得到“找不到无参数构造函数”。我们知道 AutoFi
在 Moq 中模拟 protected 虚拟(非通用)方法很容易: public class MyClass { .... protected virtual int MyMethod(D
如何验证是否使用 Moq 调用了“CallWithRef”方法? public interface ITest { void CallWithoutRef(string value, List
在我的单元测试中使用 Moq 生成 stub 和模拟,我有一个案例,我想验证是否调用了采用 Delegate 参数的方法。我不关心提供的特定 Delegate 参数,我只想确保该方法实际上被调用。该方
我是一名优秀的程序员,十分优秀!