[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"me":3,"catalog:en:backend\u002Fcsharp-testing-tooling":4,"config":253},null,{"field_key":5,"field_name":6,"seniority":7,"topic_key":8,"topic_name":9,"spec_key":7,"spec_name":7,"locale":10,"cell_total":11,"field_total":12,"seniorities":13,"topics":17,"specs":148,"samples":168},"backend","Backend","","csharp-testing-tooling","Csharp Testing Tooling","en",75,3300,[14,15,16],"junior","mid","senior",[18,21,24,27,30,33,36,39,42,43,46,49,52,55,58,61,64,67,70,73,76,79,82,85,88,91,94,97,100,103,106,109,112,115,118,121,124,127,130,133,136,139,142,145],{"key":19,"name":20,"count":11},"api-design","API Design",{"key":22,"name":23,"count":11},"caching","Caching",{"key":25,"name":26,"count":11},"concurrency","Concurrency",{"key":28,"name":29,"count":11},"csharp-concurrency-async","Csharp Concurrency Async",{"key":31,"name":32,"count":11},"csharp-exceptions","Csharp Exceptions",{"key":34,"name":35,"count":11},"csharp-generics-interfaces","Csharp Generics Interfaces",{"key":37,"name":38,"count":11},"csharp-memory-performance","Csharp Memory Performance",{"key":40,"name":41,"count":11},"csharp-stdlib-http","Csharp Stdlib Http",{"key":8,"name":9,"count":11},{"key":44,"name":45,"count":11},"databases-sql","Databases \u002F SQL",{"key":47,"name":48,"count":11},"go-concurrency","Go Concurrency",{"key":50,"name":51,"count":11},"go-errors","Go Errors",{"key":53,"name":54,"count":11},"go-interfaces-generics","Go Interfaces Generics",{"key":56,"name":57,"count":11},"go-memory-performance","Go Memory Performance",{"key":59,"name":60,"count":11},"go-stdlib-http","Go Stdlib Http",{"key":62,"name":63,"count":11},"go-testing-tooling","Go Testing Tooling",{"key":65,"name":66,"count":11},"java-concurrency","Java Concurrency",{"key":68,"name":69,"count":11},"java-exceptions","Java Exceptions",{"key":71,"name":72,"count":11},"java-generics-interfaces","Java Generics Interfaces",{"key":74,"name":75,"count":11},"java-memory-jvm","Java Memory Jvm",{"key":77,"name":78,"count":11},"java-stdlib-http","Java Stdlib Http",{"key":80,"name":81,"count":11},"java-testing-tooling","Java Testing Tooling",{"key":83,"name":84,"count":11},"messaging-queues","Messaging \u002F Queues",{"key":86,"name":87,"count":11},"networking-http","Networking \u002F HTTP",{"key":89,"name":90,"count":11},"nodejs-error-handling","Nodejs Error Handling",{"key":92,"name":93,"count":11},"nodejs-event-loop-async","Nodejs Event Loop Async",{"key":95,"name":96,"count":11},"nodejs-memory-performance","Nodejs Memory Performance",{"key":98,"name":99,"count":11},"nodejs-modules-streams","Nodejs Modules Streams",{"key":101,"name":102,"count":11},"nodejs-stdlib-http","Nodejs Stdlib Http",{"key":104,"name":105,"count":11},"nodejs-testing-tooling","Nodejs Testing Tooling",{"key":107,"name":108,"count":11},"php-concurrency-async","Php Concurrency Async",{"key":110,"name":111,"count":11},"php-exceptions","Php Exceptions",{"key":113,"name":114,"count":11},"php-generics-interfaces","Php Generics Interfaces",{"key":116,"name":117,"count":11},"php-memory-performance","Php Memory Performance",{"key":119,"name":120,"count":11},"php-stdlib-http","Php Stdlib Http",{"key":122,"name":123,"count":11},"php-testing-tooling","Php Testing Tooling",{"key":125,"name":126,"count":11},"python-concurrency-async","Python Concurrency Async",{"key":128,"name":129,"count":11},"python-errors-context","Python Errors Context",{"key":131,"name":132,"count":11},"python-memory-performance","Python Memory Performance",{"key":134,"name":135,"count":11},"python-stdlib-http","Python Stdlib Http",{"key":137,"name":138,"count":11},"python-testing-tooling","Python Testing Tooling",{"key":140,"name":141,"count":11},"python-typing-oop","Python Typing Oop",{"key":143,"name":144,"count":11},"security","Security",{"key":146,"name":147,"count":11},"testing","Testing",[149,153,156,159,162,165],{"key":150,"name":151,"count":152},"csharp","C#\u002F.NET",450,{"key":154,"name":155,"count":152},"go","Go",{"key":157,"name":158,"count":152},"java","Java",{"key":160,"name":161,"count":152},"nodejs","Node.js",{"key":163,"name":164,"count":152},"php","PHP",{"key":166,"name":167,"count":152},"python","Python",[169,187,200,214,227,240],{"id":170,"topic":9,"difficulty":171,"body":172,"options":173,"correct_key":178,"explanation":186},"019f70e2-e89d-715d-9745-661e4445d083",1,"In xUnit, what determines whether a method is discovered and run as a test?",[174,177,180,183],{"key":175,"text":176},"a","The method name must start with `Test`, since xUnit still relies on naming conventions for discovery, much like some legacy test frameworks required",{"key":178,"text":179},"b","The method must be decorated with `[Fact]` (or `[Theory]`), which xUnit's discovery mechanism scans for",{"key":181,"text":182},"c","The method must be `public static void` so the test runner can call it without creating an instance",{"key":184,"text":185},"d","The containing class must implement `ITestCase`, an interface xUnit's runner looks for at startup","xUnit discovers tests purely through attributes: `[Fact]` for a test with no parameters, `[Theory]` for a data-driven test. There is no naming-convention requirement, no `static` requirement (xUnit creates an instance per test), and no `ITestCase` interface to implement.",{"id":188,"topic":9,"difficulty":171,"body":189,"options":190,"correct_key":175,"explanation":199},"019f70e2-e89d-78c9-8c9f-90d5f0d7186a","What is the key difference between `[Fact]` and `[Theory]` in xUnit?",[191,193,195,197],{"key":175,"text":192},"`[Fact]` marks a test that takes no parameters and runs once; `[Theory]` marks a test that takes parameters and needs a data source such as `[InlineData]` to supply values",{"key":178,"text":194},"`[Fact]` is for synchronous tests and `[Theory]` is for `async Task` tests, so mixing the two attributes within the same test class requires separate assertion libraries and separate test runner configuration",{"key":181,"text":196},"`[Theory]` is simply a deprecated alias for `[Fact]` kept for backward compatibility with older test runners",{"key":184,"text":198},"`[Fact]` runs before all `[Theory]` tests in the class, acting as a setup step for the data-driven tests","`[Fact]` is for a single, parameterless test case. `[Theory]` is for a data-driven test method that takes parameters, and it requires at least one data source attribute (`[InlineData]`, `[MemberData]`, or `[ClassData]`) supplying the argument values for one or more runs. Neither attribute is about sync vs async, and there's no implicit ordering between them.",{"id":201,"topic":9,"difficulty":202,"body":203,"options":204,"correct_key":175,"explanation":213},"019f70e2-e89e-7d8b-920b-8dc9a7c79576",2,"```csharp\n[Fact]\npublic void ChecksTotal()\n{\n    int actualTotal = ComputeTotal(); \u002F\u002F returns 7\n    Assert.Equal(actualTotal, 10);\n}\n```\nThe test fails. What does the failure message report?",[205,207,209,211],{"key":175,"text":206},"\"Expected: 7, Actual: 10\" — because the first argument to `Assert.Equal` is treated as expected, and here `actualTotal` (7) was passed first by mistake",{"key":178,"text":208},"\"Expected: 10, Actual: 7\" — because xUnit always labels the smaller numeric value as the actual result, inferring intent from the values rather than argument position",{"key":181,"text":210},"A compile error, because `Assert.Equal` requires the literal expected value to be passed as the second argument",{"key":184,"text":212},"\"Expected: 10, Actual: 10\" — because xUnit resolves both arguments to the same comparison target before reporting them","`Assert.Equal(expected, actual)` treats its first argument as \"expected\" and its second as \"actual\", purely by position. Here the call is `Assert.Equal(actualTotal, 10)`, so xUnit reports `actualTotal` (7) as expected and `10` as actual. This is a common junior mistake — the arguments are swapped, which doesn't change whether the test passes or fails but does produce a misleading message.",{"id":215,"topic":9,"difficulty":202,"body":216,"options":217,"correct_key":181,"explanation":226},"019f70e2-e89f-7946-826c-81b5578602da","```csharp\npublic class MathTests\n{\n    [Theory]\n    [InlineData(2, 4)]\n    [InlineData(3, 9)]\n    public void SquaresNumber(int input, int expected)\n    {\n        Assert.Equal(expected, input * input);\n    }\n}\n```\nHow many times does `SquaresNumber` execute, and what does each `[InlineData]` provide?",[218,220,222,224],{"key":175,"text":219},"It executes once, receiving both `[InlineData]` rows merged into a single array parameter",{"key":178,"text":221},"It executes 4 times, because two `[InlineData]` attributes combined with two method parameters multiply together to produce four separate runs of the method body",{"key":181,"text":223},"It executes 2 times, once per `[InlineData]` row, with `input`\u002F`expected` bound to that row's values each time",{"key":184,"text":225},"It does not compile, because `[Theory]` methods may only have a single `[InlineData]` attribute","Each `[InlineData(...)]` attribute supplies one full set of arguments for one execution of the `[Theory]` method. With two `[InlineData]` attributes, the method runs twice: once with `input=2, expected=4`, once with `input=3, expected=9`. A `[Theory]` method can have any number of `[InlineData]` attributes stacked on it.",{"id":228,"topic":9,"difficulty":171,"body":229,"options":230,"correct_key":184,"explanation":239},"019f70e2-e8a2-70f7-bdc9-9580da366111","Why is \"test isolation\" (each test being independent of the others) considered a core testing principle?",[231,233,235,237],{"key":175,"text":232},"Isolation is mainly a performance optimization — isolated tests simply run faster because the runtime can skip class loading and assembly resolution between each individual test method",{"key":178,"text":234},"Isolation means every test must use a real database and real network calls instead of mocks, to prove the whole system works together",{"key":181,"text":236},"Isolation is only relevant for integration tests; unit tests are exempt from this principle because they never touch shared resources",{"key":184,"text":238},"An isolated test's outcome depends only on its own setup and the code under test, so it can be run alone, in any order, or in parallel and still give a reliable result","Test isolation means a test's result doesn't depend on execution order, on other tests having run first, or on leftover shared state. This matters because test runners are free to run tests in any order (and often in parallel); if tests share mutable state without resetting it, results become order-dependent and flaky. It has nothing to do with whether mocks are used, and it applies to unit tests just as much as integration tests.",{"id":241,"topic":9,"difficulty":202,"body":242,"options":243,"correct_key":178,"explanation":252},"019f70e2-e8a3-71d1-897e-4edc705700a2","```csharp\npublic class CounterTests\n{\n    private int _count;\n\n    public CounterTests()\n    {\n        _count = 10;\n    }\n\n    [Fact]\n    public void FirstIncrements()\n    {\n        _count++;\n        Assert.Equal(11, _count);\n    }\n\n    [Fact]\n    public void SecondStartsFresh()\n    {\n        Assert.Equal(10, _count);\n    }\n}\n```\nBoth tests pass when run together. Why doesn't `FirstIncrements` leaving `_count = 11` affect `SecondStartsFresh`?",[244,246,248,250],{"key":175,"text":245},"It's a coincidence of execution order — if `SecondStartsFresh` happened to run right after `FirstIncrements` within the very same test process without any restart, it would see 11 instead",{"key":178,"text":247},"xUnit creates a brand-new instance of `CounterTests` for each `[Fact]` method, so the constructor runs again and `_count` starts fresh at 10 for `SecondStartsFresh`",{"key":181,"text":249},"The test runner resets every instance field to its declared default before each `[Fact]`, even on the same object, overriding whatever the constructor set",{"key":184,"text":251},"`SecondStartsFresh` only passes because `Assert.Equal(10, _count)` reads a cached snapshot taken before `FirstIncrements` ran, not the live field value","xUnit constructs a new instance of the test class for every `[Fact]`\u002F`[Theory]` method — the constructor acts as per-test setup, replacing `[SetUp]`\u002F`[BeforeEach]` from other frameworks. `FirstIncrements` and `SecondStartsFresh` therefore run on two separate `CounterTests` objects, each getting its own fresh constructor call (`_count = 10`). Mutating `_count` in one instance has no effect on the other instance's field.",{"fields":254,"seniorities":424,"interview_shapes":425,"locales":430,"oauth":432,"question_count":435,"coach_enabled":436,"jd_match_enabled":436},[255,266,286,303,327,340,359,378,398,405,411,418],{"key":5,"name_tr":6,"name_en":6,"sort":171,"specializations":256},[257,260,261,262,263,264,265],{"key":258,"name":259,"field":5},"general","Genel",{"key":154,"name":155,"field":5},{"key":166,"name":167,"field":5},{"key":157,"name":158,"field":5},{"key":150,"name":151,"field":5},{"key":160,"name":161,"field":5},{"key":163,"name":164,"field":5},{"key":267,"name_tr":268,"name_en":268,"sort":202,"specializations":269},"frontend","Frontend",[270,271,274,277,280,283],{"key":258,"name":259,"field":267},{"key":272,"name":273,"field":267},"javascript","JavaScript",{"key":275,"name":276,"field":267},"typescript","TypeScript",{"key":278,"name":279,"field":267},"react","React",{"key":281,"name":282,"field":267},"vue","Vue",{"key":284,"name":285,"field":267},"angular","Angular",{"key":287,"name_tr":288,"name_en":288,"sort":289,"specializations":290},"fullstack","Fullstack",3,[291,292,293,294,295,296,297,298,299,300,301,302],{"key":258,"name":259,"field":287},{"key":154,"name":155,"field":5},{"key":166,"name":167,"field":5},{"key":157,"name":158,"field":5},{"key":150,"name":151,"field":5},{"key":160,"name":161,"field":5},{"key":163,"name":164,"field":5},{"key":272,"name":273,"field":267},{"key":275,"name":276,"field":267},{"key":278,"name":279,"field":267},{"key":281,"name":282,"field":267},{"key":284,"name":285,"field":267},{"key":304,"name_tr":305,"name_en":305,"sort":306,"specializations":307},"devops-cloud","DevOps \u002F Cloud",4,[308,309,312,315,318,321,324],{"key":258,"name":259,"field":304},{"key":310,"name":311,"field":304},"aws","AWS",{"key":313,"name":314,"field":304},"gcp","GCP",{"key":316,"name":317,"field":304},"azure","Azure",{"key":319,"name":320,"field":304},"kubernetes","Kubernetes",{"key":322,"name":323,"field":304},"terraform","Terraform",{"key":325,"name":326,"field":304},"linux","Linux",{"key":328,"name_tr":329,"name_en":329,"sort":330,"specializations":331},"ai-engineer","AI Engineer",5,[332,333,334,337],{"key":258,"name":259,"field":328},{"key":166,"name":167,"field":328},{"key":335,"name":336,"field":328},"llm-rag","LLM\u002FRAG",{"key":338,"name":339,"field":328},"mlops","MLOps",{"key":341,"name_tr":342,"name_en":343,"sort":344,"specializations":345},"database","Veritabanı","Database",6,[346,347,350,353,356],{"key":258,"name":259,"field":341},{"key":348,"name":349,"field":341},"postgresql","PostgreSQL",{"key":351,"name":352,"field":341},"mysql","MySQL",{"key":354,"name":355,"field":341},"mongodb","MongoDB",{"key":357,"name":358,"field":341},"redis","Redis",{"key":360,"name_tr":361,"name_en":362,"sort":363,"specializations":364},"mobile","Mobil","Mobile",7,[365,366,369,372,375],{"key":258,"name":259,"field":360},{"key":367,"name":368,"field":360},"ios-swift","iOS (Swift)",{"key":370,"name":371,"field":360},"android-kotlin","Android (Kotlin)",{"key":373,"name":374,"field":360},"flutter","Flutter",{"key":376,"name":377,"field":360},"react-native","React Native",{"key":143,"name_tr":379,"name_en":144,"sort":380,"specializations":381},"Güvenlik",8,[382,383,386,389,392,395],{"key":258,"name":259,"field":143},{"key":384,"name":385,"field":143},"appsec","AppSec",{"key":387,"name":388,"field":143},"offensive-pentest","Offensive \u002F Pentest",{"key":390,"name":391,"field":143},"cloud-security","Cloud Security",{"key":393,"name":394,"field":143},"devsecops","DevSecOps",{"key":396,"name":397,"field":143},"blue-team-incident","Blue Team \u002F Incident",{"key":399,"name_tr":400,"name_en":401,"sort":402,"specializations":403},"qa-test-automation","QA \u002F Test Otomasyonu","QA \u002F Test Automation",9,[404],{"key":258,"name":259,"field":399},{"key":406,"name_tr":407,"name_en":407,"sort":408,"specializations":409},"data-engineer","Data Engineer",10,[410],{"key":258,"name":259,"field":406},{"key":412,"name_tr":413,"name_en":414,"sort":415,"specializations":416},"game-dev","Oyun Geliştirme","Game Development",11,[417],{"key":258,"name":259,"field":412},{"key":419,"name_tr":420,"name_en":420,"sort":421,"specializations":422},"ml-engineer","ML Engineer",12,[423],{"key":258,"name":259,"field":419},[14,15,16],{"junior":426,"mid":428,"senior":429},{"questions":427,"median_sec":3},20,{"questions":427,"median_sec":3},{"questions":427,"median_sec":3},[431,10],"tr",[433,434],"google","github",21750,true]