Tag: moq

这是使用和测试使用工厂模式的类的正确方法吗?

我没有很多工厂模式的经验,我遇到过一个我认为有必要的情况,但我不确定我是否正确实施了模式,我担心它的影响我的unit testing的可读性。 我创建了一个代码片段,它近似(从内存中)我正在工作的场景的本质。 我真的很感激,如果有人可以看看它,看看我做了什么似乎是合理的。 这是我需要测试的类: public class SomeCalculator : ICalculateSomething { private readonly IReducerFactory reducerFactory; private IReducer reducer; public SomeCalculator(IReducerFactory reducerFactory) { this.reducerFactory = reducerFactory; } public SomeCalculator() : this(new ReducerFactory()){} public decimal Calculate(SomeObject so) { reducer = reducerFactory.Create(so.CalculationMethod); decimal calculatedAmount = so.Amount * so.Amount; return reducer.Reduce(so, calculatedAmount); } } 以下是一些基本的界面定义…… public interface ICalculateSomething { […]

如何使用Moq模拟SoapException以进行unit testingerror handling

我inheritance了一个调用SOAP Web服务的小型控制台应用程序。 这是一个嵌套的try-catches的悲剧性混乱,它以各种方式记录exception,并且我想围绕抛出SoapException时它的行为进行一些测试。 问题:当我无法模拟接口并且无法使属性或方法“虚拟”时,如何使用Moq模拟像SoapException这样的类? 再解释一下: 要测试此error handling,我需要控制SoapException对象的Actor属性,以及Detail属性以validationerror handling。 我的unit testing代码的片段: [TestMethod] public void MyTestMethod() { Mock soapMock = new Mock(MockBehavior.Strict); soapMock.SetupGet(ex => ex.Actor).Returns(“Test Actor”); 由于我正在模拟一个具体的类,并且Actor属性未标记为“Virtual”,因此在测试运行期间执行SetupGet(…)行时Moq会抛出此exception: System.NotSupportedException:非虚拟(在VB中可覆盖)成员上的无效设置:ex => ex.Actor 经过一些阅读,理想的答案是模拟一个界面,在这种情况下我无法做到。 由于这是.NET框架中的一个类,我也无法将Actor属性神奇地标记为虚拟。 我如何模拟SoapException,或者我可以通过不同的方式validationerror handling? 顺便说一下,我首先想要创建一个实际的SoapException,其中包含一些XML节点,但我很快就陷入了以编程方式创建XML文档树的漏洞。 我可以做到,但它需要更多的测试设置代码,如果可能的话,我想避免使用。

模拟DirectoryEntry的“属性”属性

我正在尝试对一些Active Directory代码进行unit testing,与此问题中概述的完全相同: 创建DirectoryEntry实例以用于测试 接受的答案建议为DirectoryEntry类实现一个包装器/适配器,我有: public interface IDirectoryEntry : IDisposable { PropertyCollection Properties { get; } } public class DirectoryEntryWrapper : DirectoryEntry, IDirectoryEntry { } 问题是我的IDirectoryEntry mock上的“ Properties ”属性未初始化。 试图像这样设置模拟: this._directoryEntryMock = new Mock(); this._directoryEntryMock.Setup(m => m.Properties) .Returns(new PropertyCollection()); 导致以下错误: 类型’System.DirectoryServices.PropertyCollection’没有定义构造函数 据我所知,当尝试仅使用内部构造函数实例化一个类时,会抛出此错误: 类型’…’没有定义构造函数 我试图为PropertyCollection类编写一个包装器/适配器但是没有公共构造函数我无法弄清楚如何从类中实例化或inheritance。 那么我如何在DirectoryEntry类上模拟/设置“ Properties ”属性以进行测试呢?

如何moqentity frameworkSaveChangesAsync?

Mock dbContext; [TestFixtureSetUp] public void SetupDbContext() { dbContext = new Mock(); dbContext.Setup(c => c.SaveChanges()).Verifiable(); dbContext.Setup(c => c.SaveChangesAsync()).Verifiable(); dbContext.Setup(c => c.Customers.Add(It.IsAny())) .Returns(It.IsAny()).Verifiable(); } [Test] public async Task AddCustomerAsync() { //Arrange var repository = new EntityFrameworkRepository(dbContext.Object); var customer = new Customer() { FirstName = “Larry”, LastName = “Hughes” }; //Act await repository.AddCustomerAsync(customer); //Assert dbContext.Verify(c => c.Customers.Add(It.IsAny())); dbContext.Verify(c […]

使用Moq模拟unit testing中的执行延迟

我正在尝试测试以下内容: protected IHealthStatus VerifyMessage(ISubscriber destination) { var status = new HeartBeatStatus(); var task = new Task(() => { Console.WriteLine(“VerifyMessage(Start): {0} – {1}”, DateTime.Now, WarningTimeout); Thread.Sleep(WarningTimeout – 500); Console.WriteLine(“VerifyMessage(Success): {0}”, DateTime.Now); if (CheckMessages(destination)) { return CheckResult.Success; } Console.WriteLine(“VerifyMessage(Pre-Warning): {0} – {1}”, DateTime.Now, ErrorTimeout); Thread.Sleep(ErrorTimeout – 500); Console.WriteLine(“VerifyMessage(Warning): {0}”, DateTime.Now); if (CheckMessages(destination)) { return CheckResult.Warning; } return […]

Moq测试无效方法

嗨,我是Moq测试的新手,并且很难做一个简单的断言。 我正在使用界面 public interface IAdd { void add(int a, int b); } IAdd接口的Moq是: Mock mockadd = new Mock(); mockadd.Setup(x => x.add(It.IsAny(), It.IsAny()).callback((int a, int b) => { a+b;}); IAdd testing = mockadd.Object; 由于add方法为void,因此它不会向Assert with返回任何值。 我该如何断言这个设置?

存储库中的Moq – Linq表达式 – 在设置中指定表达式

我的界面上有一个方法,如下所示: T GetSingle(Expression<Func> criteria); 我正在尝试模拟这样的设置(我意识到这不起作用): _mockUserRepository = new Mock<IRepository>(); _mockUserRepository.Setup(c => c.GetSingle(x => x.EmailAddress == “a@b.com”)) .Returns(new User{EmailAddress = “a@b.com”}); 我意识到我将错误的参数传递给设置。 读完这个答案后,我可以通过传递Expression来实现它,就像这样: _mockUserRepository.Setup(c => c.GetSingle(It.IsAny<Expression<Func>>()) .Returns(new User{EmailAddress = “a@b.com”}); 但是,这意味着如果我使用任何表达式调用GetSingle方法,则返回相同的结果。 有没有办法在设置中指定要使用的表达式?

使用Moq在C#中进行unit testing保护的方法

最近我注意到你可以使用Moq对抽象基类进行unit testing,而不是在测试中创建实现抽象基类的虚拟类。 请参见如何使用moq测试抽象类中的具体方法? 你可以这样做: public abstract class MyAbstractClass { public virtual void MyMethod() { // … } } [Test] public void MyMethodTest() { // Arrange Mock mock = new Mock() { CallBase = true }; // Act mock.Object.MyMethod(); // Assert // … } 现在我想知道是否有类似的技术允许我测试受保护的成员而不必创建包装类 。 即你如何测试这种方法: public class MyClassWithProtectedMethod { protected void MyProtectedMethod() { } […]

你能模拟一个实现接口和抽象类的对象吗?

是否可以使用Moq来模拟实现接口和抽象类的对象? 即: public class MyClass: SomeAbstractClass, IMyClass 你能嘲笑这个吗?

使用Moq模拟Delegate.Invoke()会在LINQ中引发InvalidCastexception

假设我有IService接口: public interface IService { string Name { get; set; } } 以及返回此接口的委托Func 。 在我的unit testing中,我想使用Moq模拟委托的Invoke()方法,如下所示: [TestMethod] public void UnitTest() { var mockService = new Mock(); var mockDelegate = new Mock<Func>(); mockDelegate.Setup(x => x.Invoke()).Returns(mockService.Object); // The rest of the test } 不幸的是, mockDelegate.Setup(…)抛出System.InvalidCastException : 测试方法UnitTest抛出exception: System.InvalidCastException:无法将类型为“System.Linq.Expressions.InstanceMethodCallExpressionN”的对象强制转换为“System.Linq.Expressions.InvocationExpression”。 在Moq.ExpressionExtensions.GetCallInfo(LambdaExpression表达式,模拟模拟) 在Moq.Mock。 c_ DisplayClass1c`2.b _1b() 在Moq.PexProtector.Invoke(Func`1函数) 在Moq.Mock.Setup(模拟1 mock, Expression […]