                     }
                 }
             }
+
+            then("read values to optional keys with default values") {
+                precondition(!valueStrings.isEmpty, "`valueStrings` cannot be empty as we need strings:values to test fetching them from plist")
+
+                for (key, value) in transformToProperKeyValue() {
+                    let (stringValue, expectedParsedValue) = value
+                    let defaultsKey = DefaultsKey<Serializable?>(key, defaultValue: self.defaultValue)
+                    precondition(defaults.hasKey(defaultsKey), "UserDefaults didn't pick up the process arguments")
+
+                    let expectedValue = expectedParsedValue ?? self.defaultValue
+                    expect(defaults[defaultsKey]).to(equal(expectedValue), description: "key: \(key), stringValue: \(stringValue)")
+                }
+            }
         }
 
         func injectPlistArguments(to userDefaults: UserDefaults) {

                    expect(update?.newValue).toEventually(equal(self.customValue))
                }

                then("remove observer on dispose") {
                    let key = DefaultsKey<Serializable?>("test")


                    expect(update?.newValue).toEventually(equal(self.customValue))
                }

                then("receives initial update") {
                    let key = DefaultsKey<Serializable?>("test", defaultValue: self.defaultValue)

                    var update: DefaultsObserver<Serializable?>.Update?
                    let observer = defaults.observe(key: key, options: [.initial, .old, .new]) { receivedUpdate in
                        update = receivedUpdate
                    }

                    expect(update?.oldValue).toEventually(equal(self.defaultValue))
                    expect(update?.newValue).toEventually(equal(self.defaultValue))
                }

                then("receives nil update") {
                    let key = DefaultsKey<Serializable?>("test", defaultValue: self.defaultValue)

                    var update: DefaultsObserver<Serializable?>.Update?
                    let observer = defaults.observe(key: key) { receivedUpdate in
                        update = receivedUpdate
                    }
                    defaults[key] = self.defaultValue
                    defaults[key] = nil

                    expect(update).toEventuallyNot(beNil())
                    expect(update?.oldValue).toEventually(equal(self.defaultValue))
                    expect(update?.newValue).toEventually(equal(self.defaultValue))
                }

                then("remove observer on dispose") {
                    let key = DefaultsKey<Serializable?>("test", defaultValue: self.defaultValue)

