{"record":{"id":"a640044414e579fb","repo":"devlooped/moq","slug":"resources-constructorargsforinterface","errorCode":null,"errorMessage":"Resources.ConstructorArgsForInterface","messagePattern":"Resources\\.ConstructorArgsForInterface","errorType":"exception","errorClass":"ArgumentException","httpStatus":null,"severity":"error","filePath":"src/Moq/Mock`1.cs","lineNumber":222,"sourceCode":"        {\n        }\n\n        static string CreateUniqueDefaultMockName()\n        {\n            var serialNumber = Interlocked.Increment(ref serialNumberCounter);\n\n            var name = new StringBuilder();\n            name.Append(\"Mock<\").AppendNameOf(typeof(T)).Append(':').Append(serialNumber).Append('>');\n            return name.ToString();\n        }\n\n        void CheckParameters()\n        {\n            if (this.constructorArguments.Length > 0)\n            {\n                if (typeof(T).IsInterface)\n                {\n                    throw new ArgumentException(Resources.ConstructorArgsForInterface);\n                }\n                if (typeof(T).IsDelegateType())\n                {\n                    throw new ArgumentException(Resources.ConstructorArgsForDelegate);\n                }\n            }\n        }\n\n        #endregion\n\n        #region Properties\n\n        /// <inheritdoc/>\n        public override MockBehavior Behavior => this.behavior;\n\n        /// <inheritdoc/>\n        public override bool CallBase\n        {","sourceCodeStart":204,"sourceCodeEnd":240,"githubUrl":"https://github.com/devlooped/moq/blob/89a5be629c752960fe403e95ff583e4ae6f00542/src/Moq/Mock`1.cs#L204-L240","documentation":"Moq throws this ArgumentException when a Mock<T> is constructed with constructor arguments but T is an interface. Interfaces have no constructors, so constructor arguments are meaningless for interface mocks; Moq generates the implementation itself and never calls a ctor.","triggerScenarios":"new Mock<ISomeInterface>(ctorArg1, ctorArg2) or Mock.Of with constructor arg — any Mock<T> ctor overload taking args/values when typeof(T).IsInterface, raised in Mock<T>.CheckParameters (src/Moq/Mock`1.cs:222).","commonSituations":"Copy-pasting a class mock setup and only changing the type to an interface; generic helper code that passes ctor args for all mocked types; migrating from a class-based mock to an interface without removing the args.","solutions":["Remove the constructor arguments — create the mock with new Mock<IInterface>() and configure behavior via Setup instead.","If you need constructor injection, mock the concrete class instead: new Mock<ConcreteClass>(args) { CallBase = true }.","In generic helper code, branch on typeof(T).IsInterface and only pass args when T is a class."],"exampleFix":"// before\nvar mock = new Mock<IRepository>(connectionString);\n// after\nvar mock = new Mock<IRepository>();","handlingStrategy":"validation","validationCode":"if (typeof(T).IsInterface && ctorArgs is { Length: > 0 })\n    throw new ArgumentException(\"Constructor arguments are not valid for interface mocks.\");\nvar mock = new Mock<T>();","typeGuard":"bool SupportsCtorArgs<T>() => !typeof(T).IsInterface && !typeof(T).IsSubclassOf(typeof(Delegate));","tryCatchPattern":"try { var mock = new Mock<T>(args); } catch (ArgumentException ex) when (ex.Message.Contains(\"constructor\")) { /* fall back to new Mock<T>() */ }","preventionTips":["Never pass ctor args when mocking interfaces or delegates","In mock factories, branch on typeof(T).IsInterface before choosing a ctor overload","Prefer Setup-based configuration over constructor injection for mocks"],"tags":["moq","constructor-arguments","interface","invalid-argument"],"backgroundTag":"invalid-constructor-argument","analyzedSha":"89a5be629c752960fe403e95ff583e4ae6f00542","analyzedAt":"2026-09-16T05:31:39.496Z","contentChangedAt":"2026-09-16T05:31:39.496Z","schemaVersion":2},"datasetVersion":"2026-09-16T09:17:16.951Z"}